mirror of
https://github.com/EQEmu/Server.git
synced 2025-12-12 01:11:29 +00:00
Changed a bunch of event names, made event_death returning more seamless and fixed up trading quests to have them always face target outside the parser
This commit is contained in:
parent
b26df187e6
commit
f2e0f9cca5
@ -382,7 +382,7 @@ RULE_BOOL ( NPC, EnableNPCQuestJournal, false)
|
||||
RULE_INT ( NPC, LastFightingDelayMovingMin, 10000)
|
||||
RULE_INT ( NPC, LastFightingDelayMovingMax, 20000)
|
||||
RULE_BOOL ( NPC, SmartLastFightingDelayMoving, true)
|
||||
RULE_BOOL ( NPC, ReturnNonQuestNoDropItems, false) // Returns NO DROP items on NPCs that don't have an EVENT_ITEM sub in their script
|
||||
RULE_BOOL ( NPC, ReturnNonQuestNoDropItems, false) // Returns NO DROP items on NPCs that don't have an EVENT_TRADE sub in their script
|
||||
RULE_INT ( NPC, StartEnrageValue, 9) // % HP that an NPC will begin to enrage
|
||||
RULE_BOOL ( NPC, LiveLikeEnrage, false) // If set to true then only player controlled pets will enrage
|
||||
RULE_BOOL (NPC, UseMultiQuest, false) // If true, NPC will remember items handed to them for classic multiquest support.
|
||||
|
||||
@ -432,7 +432,7 @@ void Client::HandleAAAction(aaID activate) {
|
||||
int curhp = GetTarget()->GetHP();
|
||||
target = aaTargetCurrent;
|
||||
GetTarget()->HealDamage(curhp, this);
|
||||
Death(this,0,SPELL_UNKNOWN,HAND_TO_HAND);
|
||||
Death(this, 0, SPELL_UNKNOWN, HAND_TO_HAND);
|
||||
}
|
||||
break;
|
||||
|
||||
|
||||
@ -39,7 +39,7 @@ public:
|
||||
~Corpse();
|
||||
|
||||
//abstract virtual function implementations requird by base abstract class
|
||||
virtual void Death(Mob* killerMob, int32 damage, uint16 spell_id, SkillType attack_skill) { return; }
|
||||
virtual bool Death(Mob* killerMob, int32 damage, uint16 spell_id, SkillType attack_skill) { return true; }
|
||||
virtual void Damage(Mob* from, int32 damage, uint16 spell_id, SkillType attack_skill, bool avoidable = true, int8 buffslot = -1, bool iBuffTic = false) { return; }
|
||||
virtual bool Attack(Mob* other, int Hand = 13, bool FromRiposte = false, bool IsStrikethrough = true, bool IsFromSpell = false) { return false; }
|
||||
virtual bool HasRaid() { return false; }
|
||||
|
||||
@ -185,7 +185,7 @@ bool QuestParserCollection::SpellHasQuestSub(uint32 spell_id, const char *subnam
|
||||
|
||||
bool QuestParserCollection::ItemHasQuestSub(ItemInst *itm, const char *subname) {
|
||||
std::string item_script;
|
||||
if(strcmp("EVENT_SCALE_CALC", subname) == 0 || strcmp("EVENT_ITEM_ENTERZONE", subname) == 0) {
|
||||
if(strcmp("EVENT_SCALE_CALC", subname) == 0 || strcmp("EVENT_ITEM_ENTER_ZONE", subname) == 0) {
|
||||
item_script = itm->GetItem()->CharmFile;
|
||||
} else if(strcmp("EVENT_ITEM_CLICK", subname) == 0 || strcmp("EVENT_ITEM_CLICK_CAST", subname) == 0) {
|
||||
item_script = "script_";
|
||||
@ -321,7 +321,7 @@ int QuestParserCollection::EventPlayerGlobal(QuestEventID evt, Client *client, s
|
||||
|
||||
int QuestParserCollection::EventItem(QuestEventID evt, Client *client, ItemInst *item, uint32 objid, uint32 extra_data) {
|
||||
std::string item_script;
|
||||
if(evt == EVENT_SCALE_CALC || evt == EVENT_ITEM_ENTERZONE) {
|
||||
if(evt == EVENT_SCALE_CALC || evt == EVENT_ITEM_ENTER_ZONE) {
|
||||
item_script = item->GetItem()->CharmFile;
|
||||
} else if(evt == EVENT_ITEM_CLICK || evt == EVENT_ITEM_CLICK_CAST) {
|
||||
item_script = "script_";
|
||||
|
||||
110
zone/attack.cpp
110
zone/attack.cpp
@ -1417,13 +1417,13 @@ void Client::Damage(Mob* other, int32 damage, uint16 spell_id, SkillType attack_
|
||||
}
|
||||
}
|
||||
|
||||
void Client::Death(Mob* killerMob, int32 damage, uint16 spell, SkillType attack_skill)
|
||||
bool Client::Death(Mob* killerMob, int32 damage, uint16 spell, SkillType attack_skill)
|
||||
{
|
||||
if(!ClientFinishedLoading())
|
||||
return;
|
||||
return false;
|
||||
|
||||
if(dead)
|
||||
return; //cant die more than once...
|
||||
return false; //cant die more than once...
|
||||
|
||||
if(!spell)
|
||||
spell = SPELL_UNKNOWN;
|
||||
@ -1431,11 +1431,19 @@ void Client::Death(Mob* killerMob, int32 damage, uint16 spell, SkillType attack_
|
||||
char buffer[48] = { 0 };
|
||||
snprintf(buffer, 47, "%d %d %d %d", killerMob ? killerMob->GetID() : 0, damage, spell, static_cast<int>(attack_skill));
|
||||
if(parse->EventPlayer(EVENT_DEATH, this, buffer, 0) != 0) {
|
||||
return;
|
||||
if(GetHP() < 0) {
|
||||
SetHP(0);
|
||||
}
|
||||
return false;
|
||||
}
|
||||
|
||||
if(killerMob && killerMob->IsClient() && (spell != SPELL_UNKNOWN) && damage > 0) {
|
||||
char val1[20]={0};
|
||||
entity_list.MessageClose_StringID(this, false, 100, MT_NonMelee, HIT_NON_MELEE,
|
||||
killerMob->GetCleanName(), GetCleanName(), ConvertArray(damage, val1));
|
||||
}
|
||||
|
||||
int exploss;
|
||||
|
||||
mlog(COMBAT__HITS, "Fatal blow dealt by %s with %d damage, spell %d, skill %d", killerMob ? killerMob->GetName() : "Unknown", damage, spell, attack_skill);
|
||||
|
||||
//
|
||||
@ -1649,42 +1657,6 @@ void Client::Death(Mob* killerMob, int32 damage, uint16 spell, SkillType attack_
|
||||
BuffFadeDetrimental();
|
||||
}
|
||||
|
||||
|
||||
|
||||
#if 0 // solar: commenting this out for now TODO reimplement becomenpc stuff
|
||||
if (IsBecomeNPC() == true)
|
||||
{
|
||||
if (killerMob != nullptr && killerMob->IsClient()) {
|
||||
if (killerMob->CastToClient()->isgrouped && entity_list.GetGroupByMob(killerMob) != 0)
|
||||
entity_list.GetGroupByMob(killerMob->CastToClient())->SplitExp((uint32)(level*level*75*3.5f), this);
|
||||
|
||||
else
|
||||
killerMob->CastToClient()->AddEXP((uint32)(level*level*75*3.5f)); // Pyro: Comment this if NPC death crashes zone
|
||||
//hate_list.DoFactionHits(GetNPCFactionID());
|
||||
}
|
||||
|
||||
Corpse* corpse = new Corpse(this->CastToClient(), 0);
|
||||
entity_list.AddCorpse(corpse, this->GetID());
|
||||
this->SetID(0);
|
||||
if(killerMob->GetOwner() != 0 && killerMob->GetOwner()->IsClient())
|
||||
killerMob = killerMob->GetOwner();
|
||||
if(killerMob != 0 && killerMob->IsClient()) {
|
||||
corpse->AllowMobLoot(killerMob, 0);
|
||||
if(killerMob->CastToClient()->isgrouped) {
|
||||
Group* group = entity_list.GetGroupByClient(killerMob->CastToClient());
|
||||
if(group != 0) {
|
||||
for(int i=0; i < MAX_GROUP_MEMBERS; i++) { // Doesnt work right, needs work
|
||||
if(group->members[i] != nullptr) {
|
||||
corpse->AllowMobLoot(group->members[i],i);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
#endif
|
||||
|
||||
|
||||
//
|
||||
// Finally, send em home
|
||||
//
|
||||
@ -1725,6 +1697,8 @@ void Client::Death(Mob* killerMob, int32 damage, uint16 spell, SkillType attack_
|
||||
|
||||
GoToDeath();
|
||||
}
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
bool NPC::Attack(Mob* other, int Hand, bool bRiposte, bool IsStrikethrough, bool IsFromSpell) // Kaiyodo - base function has changed prototype, need to update overloaded version
|
||||
@ -2041,7 +2015,7 @@ void NPC::Damage(Mob* other, int32 damage, uint16 spell_id, SkillType attack_ski
|
||||
}
|
||||
}
|
||||
|
||||
void NPC::Death(Mob* killerMob, int32 damage, uint16 spell, SkillType attack_skill) {
|
||||
bool NPC::Death(Mob* killerMob, int32 damage, uint16 spell, SkillType attack_skill) {
|
||||
_ZP(NPC_Death);
|
||||
mlog(COMBAT__HITS, "Fatal blow dealt by %s with %d damage, spell %d, skill %d", killerMob->GetName(), damage, spell, attack_skill);
|
||||
|
||||
@ -2053,11 +2027,20 @@ void NPC::Death(Mob* killerMob, int32 damage, uint16 spell, SkillType attack_ski
|
||||
snprintf(buffer, 31, "%d %d %d", damage, spell, static_cast<int>(attack_skill));
|
||||
if(parse->EventNPC(EVENT_DEATH, this, oos, buffer, 0) != 0)
|
||||
{
|
||||
return;
|
||||
if(GetHP() < 0) {
|
||||
SetHP(0);
|
||||
}
|
||||
return false;
|
||||
}
|
||||
|
||||
if(killerMob && killerMob->IsClient() && (spell != SPELL_UNKNOWN) && damage > 0) {
|
||||
char val1[20]={0};
|
||||
entity_list.MessageClose_StringID(this, false, 100, MT_NonMelee, HIT_NON_MELEE,
|
||||
killerMob->GetCleanName(), GetCleanName(), ConvertArray(damage, val1));
|
||||
}
|
||||
}
|
||||
|
||||
if (this->IsEngaged())
|
||||
if (IsEngaged())
|
||||
{
|
||||
zone->DelAggroMob();
|
||||
#if EQDEBUG >= 11
|
||||
@ -2071,7 +2054,7 @@ void NPC::Death(Mob* killerMob, int32 damage, uint16 spell, SkillType attack_ski
|
||||
entity_list.RemoveFromTargets(this, p_depop);
|
||||
|
||||
if(p_depop == true)
|
||||
return;
|
||||
return false;
|
||||
|
||||
BuffFadeAll();
|
||||
uint8 killed_level = GetLevel();
|
||||
@ -2379,12 +2362,14 @@ void NPC::Death(Mob* killerMob, int32 damage, uint16 spell, SkillType attack_ski
|
||||
}
|
||||
}
|
||||
|
||||
this->WipeHateList();
|
||||
WipeHateList();
|
||||
p_depop = true;
|
||||
if(killerMob && killerMob->GetTarget() == this) //we can kill things without having them targeted
|
||||
killerMob->SetTarget(nullptr); //via AE effects and such..
|
||||
|
||||
entity_list.UpdateFindableNPCState(this, true);
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
void Mob::AddToHateList(Mob* other, int32 hate, int32 damage, bool iYellForHelp, bool bFrenzy, bool iBuffTic) {
|
||||
@ -3404,23 +3389,6 @@ void Mob::CommonDamage(Mob* attacker, int32 &damage, const uint16 spell_id, cons
|
||||
}
|
||||
//final damage has been determined.
|
||||
|
||||
/*
|
||||
//check for death conditions
|
||||
if(IsClient()) {
|
||||
if((GetHP()) <= -10) {
|
||||
Death(attacker, damage, spell_id, skill_used);
|
||||
return;
|
||||
}
|
||||
} else {
|
||||
if (damage >= GetHP()) {
|
||||
//killed...
|
||||
SetHP(-100);
|
||||
Death(attacker, damage, spell_id, skill_used);
|
||||
return;
|
||||
}
|
||||
}
|
||||
*/
|
||||
|
||||
SetHP(GetHP() - damage);
|
||||
|
||||
if(HasDied()) {
|
||||
@ -3432,16 +3400,11 @@ void Mob::CommonDamage(Mob* attacker, int32 &damage, const uint16 spell_id, cons
|
||||
if(!IsSaved && !TrySpellOnDeath()) {
|
||||
SetHP(-500);
|
||||
|
||||
if(attacker && attacker->IsClient() && (spell_id != SPELL_UNKNOWN) && damage>0) {
|
||||
char val1[20]={0};
|
||||
entity_list.MessageClose_StringID(this, false, 100, MT_NonMelee, HIT_NON_MELEE, attacker->GetCleanName(), GetCleanName(),ConvertArray(damage,val1));
|
||||
if(Death(attacker, damage, spell_id, skill_used)) {
|
||||
return;
|
||||
}
|
||||
|
||||
Death(attacker, damage, spell_id, skill_used);
|
||||
return;
|
||||
}
|
||||
}
|
||||
|
||||
else{
|
||||
if(GetHPRatio() < 16)
|
||||
TryDeathSave();
|
||||
@ -3548,10 +3511,7 @@ void Mob::CommonDamage(Mob* attacker, int32 &damage, const uint16 spell_id, cons
|
||||
a->source = attacker->GetID();
|
||||
a->type = SkillDamageTypes[skill_used]; // was 0x1c
|
||||
a->damage = damage;
|
||||
// if (attack_skill != 231)
|
||||
// a->spellid = SPELL_UNKNOWN;
|
||||
// else
|
||||
a->spellid = spell_id;
|
||||
a->spellid = spell_id;
|
||||
|
||||
//Note: if players can become pets, they will not receive damage messages of their own
|
||||
//this was done to simplify the code here (since we can only effectively skip one mob on queue)
|
||||
@ -3627,8 +3587,6 @@ void Mob::CommonDamage(Mob* attacker, int32 &damage, const uint16 spell_id, cons
|
||||
filter = FilterOthersMiss;
|
||||
//make attacker (the attacker) send the packet so we can skip them and the owner
|
||||
//this call will send the packet to `this` as well (using the wrong filter) (will not happen until PC charm works)
|
||||
//LogFile->write(EQEMuLog::Debug, "Queue damage to all except %s with filter %d (%d), type %d", skip->GetName(), filter, IsClient()?CastToClient()->GetFilter(filter):-1, a->type);
|
||||
//
|
||||
// If this is Damage Shield damage, the correct OP_Damage packets will be sent from Mob::DamageShield, so
|
||||
// we don't send them here.
|
||||
if(!FromDamageShield) {
|
||||
|
||||
@ -31,7 +31,7 @@ public:
|
||||
~Beacon();
|
||||
|
||||
//abstract virtual function implementations requird by base abstract class
|
||||
virtual void Death(Mob* killerMob, int32 damage, uint16 spell_id, SkillType attack_skill) { return; }
|
||||
virtual bool Death(Mob* killerMob, int32 damage, uint16 spell_id, SkillType attack_skill) { return true; }
|
||||
virtual void Damage(Mob* from, int32 damage, uint16 spell_id, SkillType attack_skill, bool avoidable = true, int8 buffslot = -1, bool iBuffTic = false) { return; }
|
||||
virtual bool Attack(Mob* other, int Hand = 13, bool FromRiposte = false, bool IsStrikethrough = false, bool IsFromSpell = false) { return false; }
|
||||
virtual bool HasRaid() { return false; }
|
||||
|
||||
@ -2443,7 +2443,7 @@ bool Client::CalcItemScale(uint32 slot_x, uint32 slot_y, bool login)
|
||||
uint16 oldexp = e_inst->GetExp();
|
||||
|
||||
if(login) {
|
||||
parse->EventItem(EVENT_ITEM_ENTERZONE, this, e_inst, e_inst->GetID(), 0);
|
||||
parse->EventItem(EVENT_ITEM_ENTER_ZONE, this, e_inst, e_inst->GetID(), 0);
|
||||
}
|
||||
parse->EventItem(EVENT_SCALE_CALC, this, e_inst, e_inst->GetID(), 0);
|
||||
|
||||
@ -2467,7 +2467,7 @@ bool Client::CalcItemScale(uint32 slot_x, uint32 slot_y, bool login)
|
||||
uint16 oldexp = e_inst->GetExp();
|
||||
|
||||
if(login) {
|
||||
parse->EventItem(EVENT_ITEM_ENTERZONE, this, e_inst, e_inst->GetID(), 0);
|
||||
parse->EventItem(EVENT_ITEM_ENTER_ZONE, this, e_inst, e_inst->GetID(), 0);
|
||||
}
|
||||
parse->EventItem(EVENT_SCALE_CALC, this, e_inst, e_inst->GetID(), 0);
|
||||
|
||||
|
||||
@ -6199,8 +6199,9 @@ void Bot::PerformTradeWithClient(int16 beginSlotID, int16 endSlotID, Client* cli
|
||||
}
|
||||
}
|
||||
|
||||
void Bot::Death(Mob *killerMob, int32 damage, uint16 spell_id, SkillType attack_skill) {
|
||||
NPC::Death(killerMob, damage, spell_id, attack_skill);
|
||||
bool Bot::Death(Mob *killerMob, int32 damage, uint16 spell_id, SkillType attack_skill) {
|
||||
if(!NPC::Death(killerMob, damage, spell_id, attack_skill))
|
||||
return false;
|
||||
|
||||
Save();
|
||||
|
||||
@ -6299,6 +6300,8 @@ void Bot::Death(Mob *killerMob, int32 damage, uint16 spell_id, SkillType attack_
|
||||
}
|
||||
|
||||
entity_list.RemoveBot(this->GetID());
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
void Bot::Damage(Mob *from, int32 damage, uint16 spell_id, SkillType attack_skill, bool avoidable, int8 buffslot, bool iBuffTic) {
|
||||
|
||||
@ -136,7 +136,7 @@ public:
|
||||
Bot(uint32 botID, uint32 botOwnerCharacterID, uint32 botSpellsID, double totalPlayTime, uint32 lastZoneId, NPCType npcTypeData);
|
||||
|
||||
//abstract virtual function implementations requird by base abstract class
|
||||
virtual void Death(Mob* killerMob, int32 damage, uint16 spell_id, SkillType attack_skill);
|
||||
virtual bool Death(Mob* killerMob, int32 damage, uint16 spell_id, SkillType attack_skill);
|
||||
virtual void Damage(Mob* from, int32 damage, uint16 spell_id, SkillType attack_skill, bool avoidable = true, int8 buffslot = -1, bool iBuffTic = false);
|
||||
virtual bool Attack(Mob* other, int Hand = 13, bool FromRiposte = false, bool IsStrikethrough = false, bool IsFromSpell = false);
|
||||
virtual bool HasRaid() { return (GetRaid() ? true : false); }
|
||||
|
||||
@ -192,7 +192,7 @@ public:
|
||||
~Client();
|
||||
|
||||
//abstract virtual function implementations requird by base abstract class
|
||||
virtual void Death(Mob* killerMob, int32 damage, uint16 spell_id, SkillType attack_skill);
|
||||
virtual bool Death(Mob* killerMob, int32 damage, uint16 spell_id, SkillType attack_skill);
|
||||
virtual void Damage(Mob* from, int32 damage, uint16 spell_id, SkillType attack_skill, bool avoidable = true, int8 buffslot = -1, bool iBuffTic = false);
|
||||
virtual bool Attack(Mob* other, int Hand = 13, bool FromRiposte = false, bool IsStrikethrough = false, bool IsFromSpell = false);
|
||||
virtual bool HasRaid() { return (GetRaid() ? true : false); }
|
||||
|
||||
@ -6303,7 +6303,7 @@ void Client::Handle_OP_ClickDoor(const EQApplicationPacket *app)
|
||||
char buf[20];
|
||||
snprintf(buf, 19, "%u", cd->doorid);
|
||||
buf[19] = '\0';
|
||||
parse->EventPlayer(EVENT_CLICKDOOR, this, buf, 0);
|
||||
parse->EventPlayer(EVENT_CLICK_DOOR, this, buf, 0);
|
||||
|
||||
currentdoor->HandleClick(this,0);
|
||||
return;
|
||||
@ -9627,7 +9627,7 @@ void Client::CompleteConnect()
|
||||
|
||||
SendDisciplineTimers();
|
||||
|
||||
parse->EventPlayer(EVENT_ENTERZONE, this, "", 0);
|
||||
parse->EventPlayer(EVENT_ENTER_ZONE, this, "", 0);
|
||||
|
||||
//This sub event is for if a player logs in for the first time since entering world.
|
||||
if(firstlogon == 1)
|
||||
@ -10670,11 +10670,11 @@ void Client::Handle_OP_PopupResponse(const EQApplicationPacket *app) {
|
||||
char buf[16];
|
||||
sprintf(buf, "%d\0", prs->popupid);
|
||||
|
||||
parse->EventPlayer(EVENT_POPUPRESPONSE, this, buf, 0);
|
||||
parse->EventPlayer(EVENT_POPUP_RESPONSE, this, buf, 0);
|
||||
|
||||
Mob* Target = GetTarget();
|
||||
if(Target && Target->IsNPC()) {
|
||||
parse->EventNPC(EVENT_POPUPRESPONSE, Target->CastToNPC(), this, buf, 0);
|
||||
parse->EventNPC(EVENT_POPUP_RESPONSE, Target->CastToNPC(), this, buf, 0);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@ -34,7 +34,7 @@ extern Zone* zone;
|
||||
|
||||
const char *QuestEventSubroutines[_LargestEventID] = {
|
||||
"EVENT_SAY",
|
||||
"EVENT_ITEM",
|
||||
"EVENT_TRADE",
|
||||
"EVENT_DEATH",
|
||||
"EVENT_SPAWN",
|
||||
"EVENT_ATTACK",
|
||||
@ -49,25 +49,25 @@ const char *QuestEventSubroutines[_LargestEventID] = {
|
||||
"EVENT_HP",
|
||||
"EVENT_ENTER",
|
||||
"EVENT_EXIT",
|
||||
"EVENT_ENTERZONE",
|
||||
"EVENT_CLICKDOOR",
|
||||
"EVENT_ENTER_ZONE",
|
||||
"EVENT_CLICK_DOOR",
|
||||
"EVENT_LOOT",
|
||||
"EVENT_ZONE",
|
||||
"EVENT_LEVEL_UP",
|
||||
"EVENT_KILLED_MERIT",
|
||||
"EVENT_CAST_ON",
|
||||
"EVENT_TASKACCEPTED",
|
||||
"EVENT_TASK_ACCEPTED",
|
||||
"EVENT_TASK_STAGE_COMPLETE",
|
||||
"EVENT_TASK_UPDATE",
|
||||
"EVENT_TASK_COMPLETE",
|
||||
"EVENT_TASK_FAIL",
|
||||
"EVENT_AGGRO_SAY",
|
||||
"EVENT_PLAYER_PICKUP",
|
||||
"EVENT_POPUPRESPONSE",
|
||||
"EVENT_POPUP_RESPONSE",
|
||||
"EVENT_PROXIMITY_SAY",
|
||||
"EVENT_CAST",
|
||||
"EVENT_SCALE_CALC",
|
||||
"EVENT_ITEM_ENTERZONE",
|
||||
"EVENT_ITEM_ENTER_ZONE",
|
||||
"EVENT_TARGET_CHANGE",
|
||||
"EVENT_HATE_LIST",
|
||||
"EVENT_SPELL_EFFECT_CLIENT",
|
||||
@ -295,7 +295,7 @@ bool PerlembParser::ItemHasQuestSub(ItemInst *itm, const char *subname) {
|
||||
|
||||
std::string item_name;
|
||||
const Item_Struct* item = itm->GetItem();
|
||||
if(strcmp("EVENT_SCALE_CALC", subname) == 0 || strcmp("EVENT_ITEM_ENTERZONE", subname) == 0)
|
||||
if(strcmp("EVENT_SCALE_CALC", subname) == 0 || strcmp("EVENT_ITEM_ENTER_ZONE", subname) == 0)
|
||||
{
|
||||
item_name = item->CharmFile;
|
||||
}
|
||||
@ -793,7 +793,7 @@ void PerlembParser::GetQuestPackageName(bool &isPlayerQuest, bool &isGlobalPlaye
|
||||
const Item_Struct* item = iteminst->GetItem();
|
||||
package_name = "qst_item_";
|
||||
|
||||
if (event == EVENT_SCALE_CALC || event == EVENT_ITEM_ENTERZONE) {
|
||||
if (event == EVENT_SCALE_CALC || event == EVENT_ITEM_ENTER_ZONE) {
|
||||
package_name += item->CharmFile;
|
||||
}
|
||||
else if (event == EVENT_ITEM_CLICK || event == EVENT_ITEM_CLICK_CAST) {
|
||||
@ -1070,11 +1070,7 @@ void PerlembParser::ExportEventVariables(std::string &package_name, QuestEventID
|
||||
break;
|
||||
}
|
||||
|
||||
case EVENT_ITEM: {
|
||||
if (npcmob->GetAppearance() != eaDead) {
|
||||
npcmob->FaceTarget(mob);
|
||||
}
|
||||
|
||||
case EVENT_TRADE: {
|
||||
//this is such a hack... why aren't these just set directly..
|
||||
ExportVar(package_name.c_str(), "item1", GetVar("item1." + std::string(itoa(objid))).c_str());
|
||||
ExportVar(package_name.c_str(), "item2", GetVar("item2." + std::string(itoa(objid))).c_str());
|
||||
@ -1140,7 +1136,7 @@ void PerlembParser::ExportEventVariables(std::string &package_name, QuestEventID
|
||||
break;
|
||||
}
|
||||
|
||||
case EVENT_CLICKDOOR: {
|
||||
case EVENT_CLICK_DOOR: {
|
||||
ExportVar(package_name.c_str(), "doorid", data);
|
||||
ExportVar(package_name.c_str(), "version", zone->GetInstanceVersion());
|
||||
break;
|
||||
@ -1165,7 +1161,7 @@ void PerlembParser::ExportEventVariables(std::string &package_name, QuestEventID
|
||||
break;
|
||||
}
|
||||
|
||||
case EVENT_TASKACCEPTED:{
|
||||
case EVENT_TASK_ACCEPTED:{
|
||||
ExportVar(package_name.c_str(), "task_id", data);
|
||||
break;
|
||||
}
|
||||
@ -1204,7 +1200,7 @@ void PerlembParser::ExportEventVariables(std::string &package_name, QuestEventID
|
||||
break;
|
||||
}
|
||||
|
||||
case EVENT_POPUPRESPONSE:{
|
||||
case EVENT_POPUP_RESPONSE:{
|
||||
ExportVar(package_name.c_str(), "popupid", data);
|
||||
break;
|
||||
}
|
||||
@ -1217,7 +1213,7 @@ void PerlembParser::ExportEventVariables(std::string &package_name, QuestEventID
|
||||
}
|
||||
|
||||
case EVENT_SCALE_CALC:
|
||||
case EVENT_ITEM_ENTERZONE: {
|
||||
case EVENT_ITEM_ENTER_ZONE: {
|
||||
ExportVar(package_name.c_str(), "itemid", objid);
|
||||
ExportVar(package_name.c_str(), "itemname", iteminst->GetItem()->Name);
|
||||
break;
|
||||
|
||||
@ -3,7 +3,7 @@
|
||||
|
||||
typedef enum {
|
||||
EVENT_SAY = 0,
|
||||
EVENT_ITEM, //being given an item
|
||||
EVENT_TRADE, //being given an item or money
|
||||
EVENT_DEATH, //being killed
|
||||
EVENT_SPAWN, //triggered when we first spawn
|
||||
EVENT_ATTACK, //being attacked (resets after an interval of not being attacked)
|
||||
@ -18,25 +18,25 @@ typedef enum {
|
||||
EVENT_HP,
|
||||
EVENT_ENTER, //PC entering your set proximity
|
||||
EVENT_EXIT, //PC leaving your set proximity
|
||||
EVENT_ENTERZONE, //PC only, you enter zone
|
||||
EVENT_CLICKDOOR, //pc only, you click a door
|
||||
EVENT_ENTER_ZONE, //PC only, you enter zone
|
||||
EVENT_CLICK_DOOR, //pc only, you click a door
|
||||
EVENT_LOOT, //pc only
|
||||
EVENT_ZONE, //pc only
|
||||
EVENT_LEVEL_UP, //pc only
|
||||
EVENT_KILLED_MERIT, //killed by a PC or group, gave experience; will repeat several times for groups
|
||||
EVENT_CAST_ON, //pc casted a spell on npc
|
||||
EVENT_TASKACCEPTED, //pc accepted a task
|
||||
EVENT_TASK_ACCEPTED, //pc accepted a task
|
||||
EVENT_TASK_STAGE_COMPLETE,
|
||||
EVENT_TASK_UPDATE,
|
||||
EVENT_TASK_COMPLETE,
|
||||
EVENT_TASK_FAIL,
|
||||
EVENT_AGGRO_SAY,
|
||||
EVENT_PLAYER_PICKUP,
|
||||
EVENT_POPUPRESPONSE,
|
||||
EVENT_POPUP_RESPONSE,
|
||||
EVENT_PROXIMITY_SAY,
|
||||
EVENT_CAST,
|
||||
EVENT_SCALE_CALC,
|
||||
EVENT_ITEM_ENTERZONE,
|
||||
EVENT_ITEM_ENTER_ZONE,
|
||||
EVENT_TARGET_CHANGE, //target selected, target changed, or target removed
|
||||
EVENT_HATE_LIST,
|
||||
EVENT_SPELL_EFFECT_CLIENT,
|
||||
|
||||
@ -21,7 +21,7 @@
|
||||
|
||||
const char *LuaEvents[_LargestEventID] = {
|
||||
"event_say",
|
||||
"event_item",
|
||||
"event_trade",
|
||||
"event_death",
|
||||
"event_spawn",
|
||||
"event_attack",
|
||||
@ -36,25 +36,25 @@ const char *LuaEvents[_LargestEventID] = {
|
||||
"event_hp",
|
||||
"event_enter",
|
||||
"event_exit",
|
||||
"event_enterzone",
|
||||
"event_clickdoor",
|
||||
"event_enter_zone",
|
||||
"event_click_door",
|
||||
"event_loot",
|
||||
"event_zone",
|
||||
"event_level_up",
|
||||
"event_killed_merit",
|
||||
"event_cast_on",
|
||||
"event_taskaccepted",
|
||||
"event_task_accepted",
|
||||
"event_task_stage_complete",
|
||||
"event_task_update",
|
||||
"event_task_complete",
|
||||
"event_task_fail",
|
||||
"event_aggro_say",
|
||||
"event_player_pickup",
|
||||
"event_popupresponse",
|
||||
"event_popup_response",
|
||||
"event_proximity_say",
|
||||
"event_cast",
|
||||
"event_scale_calc",
|
||||
"event_item_enterzone",
|
||||
"event_item_enter_zone",
|
||||
"event_target_change",
|
||||
"event_hate_list",
|
||||
"event_spell_effect_client",
|
||||
@ -165,7 +165,7 @@ int LuaParser::_EventNPC(std::string package_name, QuestEventID evt, NPC* npc, M
|
||||
break;
|
||||
}
|
||||
|
||||
case EVENT_ITEM: {
|
||||
case EVENT_TRADE: {
|
||||
//client
|
||||
Lua_Client l_client(reinterpret_cast<Client*>(init));
|
||||
luabind::object l_client_o = luabind::object(L, l_client);
|
||||
@ -231,7 +231,7 @@ int LuaParser::_EventNPC(std::string package_name, QuestEventID evt, NPC* npc, M
|
||||
case EVENT_SLAY:
|
||||
case EVENT_ENTER:
|
||||
case EVENT_EXIT:
|
||||
case EVENT_TASKACCEPTED: {
|
||||
case EVENT_TASK_ACCEPTED: {
|
||||
//client
|
||||
Lua_Client l_client(reinterpret_cast<Client*>(init));
|
||||
luabind::object l_client_o = luabind::object(L, l_client);
|
||||
@ -251,7 +251,7 @@ int LuaParser::_EventNPC(std::string package_name, QuestEventID evt, NPC* npc, M
|
||||
break;
|
||||
}
|
||||
|
||||
case EVENT_POPUPRESPONSE:
|
||||
case EVENT_POPUP_RESPONSE:
|
||||
case EVENT_WAYPOINT_ARRIVE:
|
||||
case EVENT_WAYPOINT_DEPART: {
|
||||
//client
|
||||
@ -417,9 +417,9 @@ int LuaParser::_EventPlayer(std::string package_name, QuestEventID evt, Client *
|
||||
}
|
||||
|
||||
case EVENT_CLICK_OBJECT:
|
||||
case EVENT_CLICKDOOR:
|
||||
case EVENT_CLICK_DOOR:
|
||||
case EVENT_SIGNAL:
|
||||
case EVENT_POPUPRESPONSE:
|
||||
case EVENT_POPUP_RESPONSE:
|
||||
case EVENT_PLAYER_PICKUP:
|
||||
case EVENT_CAST:
|
||||
case EVENT_TASK_FAIL:
|
||||
@ -542,7 +542,7 @@ bool LuaParser::ItemHasQuestSub(ItemInst *itm, const char *subname) {
|
||||
|
||||
std::stringstream item_name;
|
||||
const Item_Struct* item = itm->GetItem();
|
||||
if(strcmp("EVENT_SCALE_CALC", subname) == 0 || strcmp("EVENT_ITEM_ENTERZONE", subname) == 0)
|
||||
if(strcmp("EVENT_SCALE_CALC", subname) == 0 || strcmp("EVENT_ITEM_ENTER_ZONE", subname) == 0)
|
||||
{
|
||||
item_name << item->CharmFile;
|
||||
}
|
||||
|
||||
@ -4792,9 +4792,11 @@ Mob* Merc::GetOwnerOrSelf() {
|
||||
return Result;
|
||||
}
|
||||
|
||||
void Merc::Death(Mob* killerMob, int32 damage, uint16 spell, SkillType attack_skill)
|
||||
bool Merc::Death(Mob* killerMob, int32 damage, uint16 spell, SkillType attack_skill)
|
||||
{
|
||||
NPC::Death(killerMob, damage, spell, attack_skill);
|
||||
if(!NPC::Death(killerMob, damage, spell, attack_skill))
|
||||
return false;
|
||||
|
||||
Save();
|
||||
|
||||
Mob *give_exp = hate_list.GetDamageTop(this);
|
||||
@ -4809,9 +4811,7 @@ void Merc::Death(Mob* killerMob, int32 damage, uint16 spell, SkillType attack_sk
|
||||
if(entity_list.GetCorpseByID(GetID()))
|
||||
entity_list.GetCorpseByID(GetID())->Depop();
|
||||
|
||||
if(Suspend())
|
||||
{
|
||||
}
|
||||
return true;
|
||||
}
|
||||
|
||||
Client* Merc::GetMercOwner() {
|
||||
|
||||
@ -47,7 +47,7 @@ public:
|
||||
virtual ~Merc();
|
||||
|
||||
//abstract virtual function implementations requird by base abstract class
|
||||
virtual void Death(Mob* killerMob, int32 damage, uint16 spell_id, SkillType attack_skill);
|
||||
virtual bool Death(Mob* killerMob, int32 damage, uint16 spell_id, SkillType attack_skill);
|
||||
virtual void Damage(Mob* from, int32 damage, uint16 spell_id, SkillType attack_skill, bool avoidable = true, int8 buffslot = -1, bool iBuffTic = false);
|
||||
virtual bool Attack(Mob* other, int Hand = SLOT_PRIMARY, bool FromRiposte = false, bool IsStrikethrough = false, bool IsFromSpell = false);
|
||||
virtual bool HasRaid() { return false; }
|
||||
|
||||
@ -255,7 +255,7 @@ public:
|
||||
virtual uint32 GetEquipmentColor(uint8 material_slot) const;
|
||||
virtual uint32 IsEliteMaterialItem(uint8 material_slot) const;
|
||||
bool AffectedBySpellExcludingSlot(int slot, int effect);
|
||||
virtual void Death(Mob* killerMob, int32 damage, uint16 spell_id, SkillType attack_skill) = 0;
|
||||
virtual bool Death(Mob* killerMob, int32 damage, uint16 spell_id, SkillType attack_skill) = 0;
|
||||
virtual void Damage(Mob* from, int32 damage, uint16 spell_id, SkillType attack_skill,
|
||||
bool avoidable = true, int8 buffslot = -1, bool iBuffTic = false) = 0;
|
||||
inline virtual void SetHP(int32 hp) { if (hp >= max_hp) cur_hp = max_hp; else cur_hp = hp;}
|
||||
|
||||
@ -80,7 +80,7 @@ public:
|
||||
virtual ~NPC();
|
||||
|
||||
//abstract virtual function implementations requird by base abstract class
|
||||
virtual void Death(Mob* killerMob, int32 damage, uint16 spell_id, SkillType attack_skill);
|
||||
virtual bool Death(Mob* killerMob, int32 damage, uint16 spell_id, SkillType attack_skill);
|
||||
virtual void Damage(Mob* from, int32 damage, uint16 spell_id, SkillType attack_skill, bool avoidable = true, int8 buffslot = -1, bool iBuffTic = false);
|
||||
virtual bool Attack(Mob* other, int Hand = 13, bool FromRiposte = false, bool IsStrikethrough = false, bool IsFromSpell = false);
|
||||
virtual bool HasRaid() { return false; }
|
||||
|
||||
@ -3252,7 +3252,7 @@ void ClientTaskState::AcceptNewTask(Client *c, int TaskID, int NPCID) {
|
||||
return;
|
||||
}
|
||||
taskmanager->SaveClientState(c, this);
|
||||
parse->EventNPC(EVENT_TASKACCEPTED, npc, c, buf, 0);
|
||||
parse->EventNPC(EVENT_TASK_ACCEPTED, npc, c, buf, 0);
|
||||
safe_delete_array(buf);
|
||||
|
||||
}
|
||||
|
||||
@ -569,7 +569,7 @@ void Client::FinishTrade(Mob* tradingWith, ServerPacket* qspack, bool finalizer)
|
||||
}
|
||||
|
||||
bool quest_npc = false;
|
||||
if(parse->HasQuestSub(tradingWith->GetNPCTypeID(), "EVENT_ITEM")) {
|
||||
if(parse->HasQuestSub(tradingWith->GetNPCTypeID(), "EVENT_TRADE")) {
|
||||
// This is a quest NPC
|
||||
quest_npc = true;
|
||||
if(RuleB(NPC, UseMultiQuest)){
|
||||
@ -630,12 +630,11 @@ void Client::FinishTrade(Mob* tradingWith, ServerPacket* qspack, bool finalizer)
|
||||
//dont bother with this crap unless we have a quest...
|
||||
//pets can have quests! (especially charmed NPCs)
|
||||
if (quest_npc) {
|
||||
|
||||
char temp1[100];
|
||||
memset(temp1,0x0,100);
|
||||
char temp2[100];
|
||||
memset(temp2,0x0,100);
|
||||
for ( int z=0; z < 4; z++ ) {
|
||||
for(int z = 0; z < 4; z++) {
|
||||
snprintf(temp1, 100, "item%d.%d", z+1,tradingWith->GetNPCTypeID());
|
||||
snprintf(temp2, 100, "%d",items[z]);
|
||||
parse->AddVar(temp1,temp2);
|
||||
@ -658,7 +657,12 @@ void Client::FinishTrade(Mob* tradingWith, ServerPacket* qspack, bool finalizer)
|
||||
snprintf(temp1, 100, "platinum.%d", tradingWith->GetNPCTypeID());
|
||||
snprintf(temp2, 100, "%i",trade->pp);
|
||||
parse->AddVar(temp1,temp2);
|
||||
parse->EventNPC(EVENT_ITEM, tradingWith->CastToNPC(), this, "", 0);
|
||||
|
||||
if(tradingWith->GetAppearance() != eaDead) {
|
||||
tradingWith->FaceTarget(this);
|
||||
}
|
||||
|
||||
parse->EventNPC(EVENT_TRADE, tradingWith->CastToNPC(), this, "", 0);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
Loading…
x
Reference in New Issue
Block a user