1. warum funktioniert es nur bei menschen? nicht bei orks, tieren, echsenmenschen ect.
Es gibt Zwei unterschiedliche Schadenswahrnehmungen. Wahrscheinlich rufst du deinen code zurzeit nur in B_AssessDamage auf. Es gibt auch B_MM_AssessDamage.
Zitat von joey1990
gibt es eine funktion die zb wenn waffe angelegt ist wirkt?
Code:
var C_ITEM weapon; weapon = Npc_GetReadiedWeapon(other);
if(Hlp_getInstanceID(weapon) == ITMW_WHATEVER){
//mach was
}
edit:
Deine Funktion benutzt die variablen slf und oth:
Code:
func void B_RagnaSpecialDamage (var C_NPC oth, var C_NPC slf)
Es gibt Zwei unterschiedliche Schadenswahrnehmungen. Wahrscheinlich rufst du deinen code zurzeit nur in B_AssessDamage auf. Es gibt auch B_MM_AssessDamage.
ja, nur da rufe ich den code auf, soll ich ihn dann in B_MM_AssessDamage auch aufrufen?
Zitat von Cryp18Struct
Code:
var C_ITEM weapon; weapon = Npc_GetReadiedWeapon(other);
if(Hlp_getInstanceID(weapon) == ITMW_WHATEVER){
//mach was
}
ahh danke, das versuche ich gleich mal
Zitat von Cryp18Struct
edit:
Deine Funktion benutzt die variablen slf und oth:
Code:
func void B_RagnaSpecialDamage (var C_NPC oth, var C_NPC slf)
ja, nur da rufe ich den code auf, soll ich ihn dann in B_MM_AssessDamage auch aufrufen?
Ja. B_MM_ASSESSDAMAGE ist halt die Funktion welche von nicht menschlichen NPCs benutzt wird(Tiere, Orks, ...).
Zitat von joey1990
also wie genau müsste das dann aussehen? hero und self durch oth und slf ersetzen :/
in B_AssessDamage ist self derjenige welcher getroffen wird und other derjenige welcher zugeschlagen hat. Wenn du dort
Code:
B_RagnaSpecialDamage (other, self);
aufrufst, dann ist in der Funktion B_RagnaSpecialDamage slf derjenige welcher getroffen wird und oth ist derjenige welcher zugeschlagen hat.
In der Funktion kannst du dann immer slf und oth verwenden, je nachdem ob ein Effekt bei dem Kerl gestartet werden soll welcher getroffen wurde oder halt bei dem welcher zugeschlagen hat.
edit:
Zurzeit würfelst du eine Zufallszahl zwischen 0 und 89
Code:
DamageRandyRagna = Hlp_Random (90);
und fragst dann ab ob diese Zahl kleinergleich 90 ist
Code:
(DamageRandyRagna <= 90)
Das könntest du dir auch sparen. Weil das immer der Fall ist.
Willst du denn das der Spezialeffekt immer kommt wenn jemand mit dieser Waffe getroffen wird oder nur manchmal?
Geändert von Cryp18Struct (13.02.2018 um 21:38 Uhr)
Kannst du mir den code bitte fehlerfrei machen... ich blcike nun nicht mehr durch... geschafft ist nun das monster, orks ect blitze bekommen und die waffe nur angelegt die blitze machen!
Du könntest der Waffe Feuerschaden geben. Hier mal ein schwerer Ast welcher 70 BLUNT und 30 FIRE Schaden macht. Wenn man damit jemanden trifft brennt er.
Du könntest der Waffe Feuerschaden geben. Hier mal ein schwerer Ast welcher 70 BLUNT und 30 FIRE Schaden macht. Wenn man damit jemanden trifft brennt er.
Ja, das weis ich, das habe ich bei einigen waffen auch schon gemacht... nur hier brennen halt gegner durch ein blaues feuer.... wenn ich das jetzt in der waffe festlege, kommt ein normales feuer dazu, sieht dann nicht sonderlich schön aus.. deshalb die frage ob das möglich ist solange der VOB_BLUEMAGICBURN ist, das da sekweise leben abgezogen wird^^
okay, danke... ein problem ahbe ich allerdings noch... sobald ich die waffe einmal angelegt habe, springt der effekt immernoch auf alle waffen und die fäuste über...egal ob ich dann die waffe noch im inventar habe oder nicht
Hast du vielleicht noch Reste deines alten codes nicht entfernt? Poste ruhig nochmal B_RagnaSpecialDamage und die beiden AssessDamage Funktionen.
Okay... ich habe das allerdings in die B_BeliarsWeaponSpecialDamage eingefügt.... was ich noch herausgefunden habe, das die beliarwaffe keinen blitz mehr macht... bzw auch den schaden nicht... hier mal der gesamte code... meine neue waffe ist rot:
B_BeliarsWeaponSpecialDamage
Spoiler:(zum lesen bitte Text markieren)
Code:
var int RavenBlitz;
func void B_BeliarsWeaponSpecialDamage (var C_NPC oth, var C_NPC slf) //other ist angreifer, slf ist victim
{
if (Hlp_GetInstanceID(slf) == Hlp_GetInstanceID(Raven)) //HACK: egal, welche Waffe Raven hat
{
//Ambient Pfx
Wld_PlayEffect("spellFX_BELIARSRAGE_COLLIDE", slf, slf, 0, 0, 0, FALSE );
if (RavenBlitz <= 0)
{
Wld_PlayEffect("spellFX_BELIARSRAGE", oth, oth, 0, 0, 0, FALSE );
B_MagicHurtNpc (slf, oth, 50); //Extraschaden von Raven!
RavenBlitz += 1;
}
else if (RavenBlitz >= 3)
{
var int RavenRandy; RavenRandy = Hlp_Random(3);
if (RavenRandy <= 50)
{
RavenBlitz = 0; //wieder von vorne
};
}
else
{
RavenBlitz += 1;
};
}
else if (Hlp_GetInstanceID(oth) == Hlp_GetInstanceID(hero))
{
var int DamageRandy;
DamageRandy = Hlp_Random (100);
if (C_ScHasReadiedBeliarsWeapon())
&& (DamageRandy <= BeliarDamageChance)
{
if (slf.aivar[AIV_MM_REAL_ID] == ID_DRAGON_UNDEAD) //beim untoten Drachen nimmt der SC Schaden
{
Wld_PlayEffect("spellFX_BELIARSRAGE", oth, oth, 0, 0, 0, FALSE );
B_MagicHurtNpc (slf, oth, 100);
}
else if (slf.flags != NPC_FLAG_IMMORTAL)
{
Wld_PlayEffect("spellFX_BELIARSRAGE", slf, slf, 0, 0, 0, FALSE );
B_MagicHurtNpc (oth, slf, 100);
};
//Ambient Pfx
Wld_PlayEffect("spellFX_BELIARSRAGE_COLLIDE", hero, hero, 0, 0, 0, FALSE );
};
if (C_ScHasReadiedBeliarsWeapon())
&& (DamageRandy <= 100) // Effekt
{
//Ambient Pfx
Wld_PlayEffect("spellFX_BELIARSRAGE_COLLIDE", hero, hero, 0, 0, 0, FALSE );
};
};
};
var int RagnaWaffe;
func void B_RagnaSpecialDamage (var C_NPC oth, var C_NPC slf) //oth ist angreifer, slf ist der getroffene. Aufruf aus B_AssessDamage und B_MM_AssessDamag mit B_RagnaSpecialDamage(other, self)
{
var C_ITEM weapon; weapon = Npc_GetReadiedWeapon(oth);
if(Hlp_getInstanceID(weapon) == Itmw_uriziel_03)
{
if (Hlp_GetInstanceID(oth) == Hlp_GetInstanceID(hero)) // Falls auch andere NPCs diese Waffe benutzen können sollen kann diese Abfrage weg
{
if ((slf.flags & NPC_FLAG_IMMORTAL) != NPC_FLAG_IMMORTAL) // bitfield beachten, könnte ja auch unsterbliche Geister geben
{
Wld_PlayEffect("spellFX_BELIARSRAGE", slf, slf, 0, 0, 0, true );
Wld_PlayEffect("spellFX_BELIARSRAGE_COLLIDE", slf, slf, 0, 0, 0, false );
B_MagicHurtNpc (oth, slf, 100);
Wld_PlayEffect("VOB_BLUEMAGICBURN", slf, slf, 0, 0, 0, true); // eventll. Feuerschaden so eintragen ... Wld_PlayEffect("VOB_BLUEMAGICBURN", hero, self, 2, 20, DAM_FIRE, TRUE); (habe ich noch nicht getestet)
B_MagicHurtNpc (oth, slf, 20);
};
};
};
};
B_AssessDamage
Spoiler:(zum lesen bitte Text markieren)
Code:
// ****************************************************************
// B_AssessDamage
// --------------
// wird durchWahrnehmung PERC_AssessDamage ÜBERALL her aufgerufen
// (also auch aus ZS_Attack, AR kann sich allerdings NICHT ändern!)
// ****************************************************************
func void B_AssessDamage ()
{
var C_NPC Quarho; Quarho = Hlp_GetNpc (NONE_ADDON_111_Quarhodron);
var C_NPC Rhadem; Rhadem = Hlp_GetNpc (NONE_ADDON_112_Rhademes);
if ((Hlp_GetInstanceID(self) == Hlp_GetInstanceID(Quarho)))
|| ((Hlp_GetInstanceID(self) == Hlp_GetInstanceID(Rhadem)))
{
B_GhostSpecialDamage (other, self);
return;
};
//***********************************************
// Ragna spezial Waffe
B_BeliarsWeaponSpecialDamage (other, self);
B_RagnaSpecialDamage (other, self);
B_RagnaSpecialDamage2 (other, self);
//***********************************************
var C_ITEM ma_pfeil; ma_pfeil = Npc_GetReadiedWeapon(other);
if (ma_pfeil.munition==ItRw_Addon_MagicArrow)
|| (ma_pfeil.munition==ItRw_Addon_Magicbolt)
{
self.Aivar[AIV_MAGIEPFEIL] = True; // Markiert das Ziel
Wld_PlayEffect("VOB_BLUEMAGICBURN", self, self, 0, 0, 0, False); // eventll. Feuerschaden so eintragen ... Wld_PlayEffect("VOB_BLUEMAGICBURN", hero, self, 2, 20, DAM_FIRE, TRUE); (habe ich noch nicht getestet)
Npc_ChangeAttribute (self, ATR_HITPOINTS, -1); // eventuell zusätzlichen Feuerschaden einfügen mit -HP, das funktioniert auf jeden Fall
self.Aivar[AIV_MAGIEPFEIL] = false; // Zielmarkierung aufheben, wichtig sonst wird endlos ein Feuereffekt nach dem anderen abgeschossen, was zum Absturz des Games führt
};
var C_ITEM br_pfeil; br_pfeil = Npc_GetReadiedWeapon(other);
if (br_pfeil.munition==ItRw_ADDON_FireArrow)
|| (br_pfeil.munition==ItRw_ADDON_Firebolt)
|| (br_pfeil.munition==ItRw_DemonArrow)
{
self.Aivar[AIV_BRANDPFEIL] = True; // Markiert das Ziel
Wld_PlayEffect("Vob_Burn", self, self, 0, 0, 0, False); // eventll. Feuerschaden so eintragen ... Wld_PlayEffect("Vob_Burn", hero, self, 2, 20, DAM_FIRE, TRUE); (habe ich noch nicht getestet)
Npc_ChangeAttribute (self, ATR_HITPOINTS, -1); // eventuell zusätzlichen Feuerschaden einfügen mit -HP, das funktioniert auf jeden Fall
self.Aivar[AIV_BRANDPFEIL] = false; // Zielmarkierung aufheben, wichtig sonst wird endlos ein Feuereffekt nach dem anderen abgeschossen, was zum Absturz des Games führt
};
B_BeliarsWeaponSpecialDamage (other, self);
//B_MM_SpecialAttack (other);
//AIVARS
if (self.aivar[AIV_ArenaFight] == AF_AFTER)
{
self.aivar[AIV_ArenaFight] = AF_AFTER_PLUS_DAMAGE;
};
if self.aivar [AIV_EnemyOverride] == TRUE
{
var C_NPC RAV; RAV = Hlp_GetNpc(BDT_1090_Addon_Raven);
if (Hlp_GetInstanceID(self) == (Hlp_GetInstanceID(RAV)))
{
self.aivar [AIV_EnemyOverride] = FALSE;
};
};
// ------ Wenn NSC im ZS_Attack ------
if (Npc_IsInState(self,ZS_Attack))
{
// EXIT IF...
// ------ Freunde ignorieren Treffer vom Spieler im Kampf ------
if (Npc_IsPlayer (other))
&& (self.npctype == NPCTYPE_FRIEND)
{
return;
};
// ------ Partymember ignorieren Treffer vom Spieler im Kampf ------
if (Npc_IsPlayer (other))
&& (self.aivar[AIV_PARTYMEMBER] == TRUE)
{
return;
};
if (self.aivar[AIV_PARTYMEMBER] == TRUE)
&& (other.aivar[AIV_PARTYMEMBER] == TRUE)
{
return;
};
// FUNC
// ------ Wenn ich von jemand ANDEREM getroffen werde ------
if (Hlp_GetInstanceID (other) != self.aivar[AIV_LASTTARGET])
{
// ------ NEUER Angreifer ist NPC ODER zum zweiten MAl (von Hero) getroffen ------
if (self.aivar[AIV_HitByOtherNpc] == Hlp_GetInstanceID (other))
|| (Hlp_GetInstanceID(other) != Hlp_GetInstanceID(hero))
{
Npc_SetTarget (self, other); //Ziel wechseln
}
else //NEUER Angreifer ist hero und trifft zum ersten mal
{
self.aivar[AIV_HitByOtherNpc] = Hlp_GetInstanceID (other); //EIN Freischlag
};
};
return;
};
// EXIT IF
// ------ NSC ist ENEMY -----
if (B_AssessEnemy())
{
return;
};
// ------ Egill/Enim NSCs (Story-Angreifer) ------
if (!Npc_IsPlayer(other))
&& (other.aivar[AIV_ATTACKREASON] == AR_NONE)
{
B_Attack (self, other, AR_NONE, 0); //angreifen oder fliehen
return;
};
// ------ Spieler hat mit NK-Waffe angegriffen ------
if (Npc_IsInFightMode (other, FMODE_MELEE))
|| (Npc_IsInFightMode (other, FMODE_FIST))
|| (Npc_IsInFightMode (other, FMODE_NONE)) //oder Waffe wieder weggesteckt (nicht ermittelbar)
{
// ------ NSC ist freundlich ODER npctype_friend ------
if (Npc_GetAttitude (self, other) == ATT_FRIENDLY)
|| ( (self.npctype == NPCTYPE_FRIEND) && Npc_IsPlayer(other) )
{
// ------- nur wenn ich zum ERSTEN Mal geschlagen werde -------
if (!Npc_IsInState(self, ZS_ReactToDamage))
{
Npc_ClearAIQueue (self);
B_ClearPerceptions (self); //schaltet alle Wahrnehmungen ab - so kann keine später priorisierte diesen Stateaufruf verhindern (s. z.B. AssessFightSound + AssessDamage)
AI_StartState (self, ZS_ReactToDamage, 0, "");
return; //im unterern B_Attack wird ein ClearQueue aufgerufen, der den AI_StartState direkt wieder aus der queue löscht
// - sicherheithalber bei allen AI_StartState-Aufrufen return anfügen
};
};
};
// FUNC
B_Attack (self, other, AR_ReactToDamage, 0); //angreifen oder fliehen
return;
};
B_MM_AssessDamage
Spoiler:(zum lesen bitte Text markieren)
Code:
// *****************
// B_MM_AssessDamage
// *****************
func void B_MM_AssessDamage ()
{
self.aivar[AIV_MM_PRIORITY] = PRIO_ATTACK;
var C_ITEM ma_pfeil; ma_pfeil = Npc_GetReadiedWeapon(other);
if (ma_pfeil.munition==ItRw_Addon_MagicArrow)
|| (ma_pfeil.munition==ItRw_Addon_Magicbolt)
{
self.Aivar[AIV_MAGIEPFEIL] = True; // Markiert das Ziel
Wld_PlayEffect("VOB_BLUEMAGICBURN", self, self, 0, 0, 0, False); // eventll. Feuerschaden so eintragen ... Wld_PlayEffect("VOB_BLUEMAGICBURN", hero, self, 2, 20, DAM_FIRE, TRUE); (habe ich noch nicht getestet)
Npc_ChangeAttribute (self, ATR_HITPOINTS, -1); // eventuell zusätzlichen Feuerschaden einfügen mit -HP, das funktioniert auf jeden Fall
self.Aivar[AIV_MAGIEPFEIL] = false; // Zielmarkierung aufheben, wichtig sonst wird endlos ein Feuereffekt nach dem anderen abgeschossen, was zum Absturz des Games führt
};
var C_ITEM br_pfeil; br_pfeil = Npc_GetReadiedWeapon(other);
if (br_pfeil.munition==ItRw_ADDON_FireArrow)
|| (br_pfeil.munition==ItRw_ADDON_Firebolt)
|| (br_pfeil.munition==muni)
|| (br_pfeil.munition==ItRw_DemonArrow)
{
self.Aivar[AIV_BRANDPFEIL] = True; // Markiert das Ziel
Wld_PlayEffect("Vob_Burn", self, self, 0, 0, 0, False); // eventll. Feuerschaden so eintragen ... Wld_PlayEffect("Vob_Burn", hero, self, 2, 20, DAM_FIRE, TRUE); (habe ich noch nicht getestet)
Npc_ChangeAttribute (self, ATR_HITPOINTS, -1); // eventuell zusätzlichen Feuerschaden einfügen mit -HP, das funktioniert auf jeden Fall
self.Aivar[AIV_BRANDPFEIL] = false; // Zielmarkierung aufheben, wichtig sonst wird endlos ein Feuereffekt nach dem anderen abgeschossen, was zum Absturz des Games führt
};
B_BeliarsWeaponSpecialDamage (other, self);
B_RagnaSpecialDamage (other, self);
B_RagnaSpecialDamage2 (other, self);
// EXIT IF
// ------ SONDERFALL: Magic Golem ------ //JUUUUNGEEEEE!!!
if (Npc_HasItems (other, Holy_Hammer_MIS) > 0)
{
var C_NPC MagGol; MagGol = Hlp_GetNpc(MagicGolem);
Npc_GetInvItem(other, Holy_Hammer_MIS); //befüllt 'item'
var C_ITEM OthWeap; OthWeap = Npc_GetReadiedWeapon(other);
if (Hlp_GetInstanceID(self) == Hlp_GetInstanceID(MagGol))
&& (Hlp_GetInstanceID(OthWeap) == Hlp_GetInstanceID(item))
{
Npc_ChangeAttribute (self, ATR_HITPOINTS, -1000);
return;
};
};
if (self.guild == GIL_STONEGUARDIAN)
&& (self.aivar[AIV_EnemyOverride] == TRUE)
{
if (self.aivar[AIV_MM_REAL_ID] != ID_Masterguardian)
{
B_AWAKE_STONEGUARDIAN (self);
}
else
{
Npc_ChangeAttribute (self, ATR_HITPOINTS, self.attribute [ATR_HITPOINTS_MAX]);
};
};
// ----- wenn Monster Beute von Angreifer ------
if (C_PredatorFoundPrey(other,self))
{
Npc_ClearAIQueue (self);
Npc_SetTarget (self, other);
B_ClearPerceptions (self);
AI_StartState (self, ZS_MM_Flee, 0, "");
return;
};
if (self.aivar[AIV_MM_REAL_ID] == ID_Swarm)
{
Npc_ChangeAttribute (other, ATR_HITPOINTS, -15);
};
// ------ wenn Monster im ZS_Attack ------
if (Npc_IsInState(self,ZS_MM_Attack))
{
// EXIT IF...
// ------ Partymember ignorieren Treffer vom Spieler im Kampf ------
if (Npc_IsPlayer (other))
&& (self.aivar[AIV_PARTYMEMBER] == TRUE)
{
return;
};
//B_MM_SpecialAttack (self);
// ------ HACK: von Skelettmagier getroffene Skelette ignorieren Schaden ------
if (self.aivar[AIV_MM_REAL_ID] == ID_SKELETON)
&& (other.aivar[AIV_MM_REAL_ID] == ID_SKELETON_MAGE)
{
return;
};
// FUNC
// ------ Wenn ich von jemand ANDEREM getroffen werde ------
if (Hlp_GetInstanceID (other) != self.aivar[AIV_LASTTARGET])
{
if (self.aivar[AIV_HitByOtherNpc] == Hlp_GetInstanceID (other))
{
Npc_SetTarget (self, other); //Ziel wechseln, wenn zum zweiten Mal getroffen
}
else
{
self.aivar[AIV_HitByOtherNpc] = Hlp_GetInstanceID (other); //EIN Freischlag
};
};
return;
};
// FUNC
Npc_ClearAIQueue (self);
Npc_SetTarget (self, other);
B_ClearPerceptions (self);
AI_StartState (self, ZS_MM_Attack, 0, "");
return;
};
Du rufst die Funktion B_RagnaSpecialDamage2 auf. Zeig mal bitte was da gemacht wird.
Wegen Klaue Beliars schau mal welchen Wert BeliarDamageChance hat:
Code:
func void B_BeliarsWeaponSpecialDamage (var C_NPC oth, var C_NPC slf) //other ist angreifer, slf ist victim
{
print(IntToString(BeliarDamageChance)); // zum Testen diese Zeile hier einfügen
if (Hlp_GetInstanceID(slf) == Hlp_GetInstanceID(Raven)) //HACK: egal, welche Waffe Raven hat
{
[rest der Funktion normal lassen]
Wenn du dir die Klaue zum Testen einfach ercheatest wird der Wert wahrscheinlich nie gesetzt. Das passiert normalerweise in B_UpgrateBeliarsWeapon() wenn man am Schrein betet.
Du rufst die Funktion B_RagnaSpecialDamage2 auf. Zeig mal bitte was da gemacht wird.
Da fängt der gegner nur feuer mit einen kleinem schaden....
wenn ich nämlich feuerschaden im waffenskript mache müsste ich den auf 250 setzen, damit auch jeder gegner feuer fängt (wegen dem rüstungsschutz der gegener) da wäre die waffe zu mächtig....! es sollen quasi die gegner nur feuer fangen, ohne großen schaden und egal wie hoch deren feuerschutz ist! das funktioniert aber auch soweit ich getestet habe ganz gut.
Zitat von Cryp18Struct
Wegen Klaue Beliars schau mal welchen Wert BeliarDamageChance hat:
Code:
func void B_BeliarsWeaponSpecialDamage (var C_NPC oth, var C_NPC slf) //other ist angreifer, slf ist victim
{
print(IntToString(BeliarDamageChance)); // zum Testen diese Zeile hier einfügen
if (Hlp_GetInstanceID(slf) == Hlp_GetInstanceID(Raven)) //HACK: egal, welche Waffe Raven hat
{
[rest der Funktion normal lassen]
Wenn du dir die Klaue zum Testen einfach ercheatest wird der Wert wahrscheinlich nie gesetzt. Das passiert normalerweise in B_UpgrateBeliarsWeapon() wenn man am Schrein betet.
Ja, ich habe sie nur hergecheatet... sollte ich sie mal zum testen als rohwaffe cheaten und weihen ?