diff options
author | megamage <none@none> | 2009-02-19 18:56:50 -0600 |
---|---|---|
committer | megamage <none@none> | 2009-02-19 18:56:50 -0600 |
commit | ec52b48c46bcf17bbd12c9ad0b8a6b4e9e8f1937 (patch) | |
tree | c0a1cb88b469842117991403f041be84c66f9368 | |
parent | cb7a85994cc184cbf5dfe29164aa838c7ac2af57 (diff) |
[7305] Allow use datalong2 not only for set target for DB script cast but also caster (1 bit set target (target/source), 2 bit set caster (source/target)) Author: VladimirMangos
--HG--
branch : trunk
-rw-r--r-- | src/game/ObjectMgr.cpp | 21 | ||||
-rw-r--r-- | src/game/World.cpp | 24 | ||||
-rw-r--r-- | src/game/World.h | 3 | ||||
-rw-r--r-- | src/shared/revision_nr.h | 2 |
4 files changed, 43 insertions, 7 deletions
diff --git a/src/game/ObjectMgr.cpp b/src/game/ObjectMgr.cpp index 85706bc088e..2dd63e1691a 100644 --- a/src/game/ObjectMgr.cpp +++ b/src/game/ObjectMgr.cpp @@ -3895,6 +3895,21 @@ void ObjectMgr::LoadScripts(ScriptMapMap& scripts, char const* tablename) } case SCRIPT_COMMAND_REMOVE_AURA: + { + if(!sSpellStore.LookupEntry(tmp.datalong)) + { + sLog.outErrorDb("Table `%s` using non-existent spell (id: %u) in SCRIPT_COMMAND_REMOVE_AURA or SCRIPT_COMMAND_CAST_SPELL for script id %u", + tablename,tmp.datalong,tmp.id); + continue; + } + if(tmp.datalong2 & ~0x1) // 1 bits (0,1) + { + sLog.outErrorDb("Table `%s` using unknown flags in datalong2 (%u)i n SCRIPT_COMMAND_CAST_SPELL for script id %u", + tablename,tmp.datalong2,tmp.id); + continue; + } + break; + } case SCRIPT_COMMAND_CAST_SPELL: { if(!sSpellStore.LookupEntry(tmp.datalong)) @@ -3903,6 +3918,12 @@ void ObjectMgr::LoadScripts(ScriptMapMap& scripts, char const* tablename) tablename,tmp.datalong,tmp.id); continue; } + if(tmp.datalong2 & ~0x3) // 2 bits + { + sLog.outErrorDb("Table `%s` using unknown flags in datalong2 (%u)i n SCRIPT_COMMAND_CAST_SPELL for script id %u", + tablename,tmp.datalong2,tmp.id); + continue; + } break; } } diff --git a/src/game/World.cpp b/src/game/World.cpp index 21fb07d5794..520749285f8 100644 --- a/src/game/World.cpp +++ b/src/game/World.cpp @@ -2330,24 +2330,40 @@ void World::ScriptsProcess() break; } - Object* cmdTarget = step.script->datalong2 ? source : target; + Object* cmdTarget = step.script->datalong2 & 0x01 ? source : target; if(!cmdTarget) { - sLog.outError("SCRIPT_COMMAND_CAST_SPELL call for NULL %s.",step.script->datalong2 ? "source" : "target"); + sLog.outError("SCRIPT_COMMAND_CAST_SPELL call for NULL %s.",step.script->datalong2 & 0x01 ? "source" : "target"); break; } if(!cmdTarget->isType(TYPEMASK_UNIT)) { - sLog.outError("SCRIPT_COMMAND_CAST_SPELL %s isn't unit (TypeId: %u), skipping.",step.script->datalong2 ? "source" : "target",cmdTarget->GetTypeId()); + sLog.outError("SCRIPT_COMMAND_CAST_SPELL %s isn't unit (TypeId: %u), skipping.",step.script->datalong2 & 0x01 ? "source" : "target",cmdTarget->GetTypeId()); break; } Unit* spellTarget = (Unit*)cmdTarget; + Object* cmdSource = step.script->datalong2 & 0x02 ? target : source; + + if(!cmdSource) + { + sLog.outError("SCRIPT_COMMAND_CAST_SPELL call for NULL %s.",step.script->datalong2 & 0x02 ? "target" : "source"); + break; + } + + if(!cmdSource->isType(TYPEMASK_UNIT)) + { + sLog.outError("SCRIPT_COMMAND_CAST_SPELL %s isn't unit (TypeId: %u), skipping.",step.script->datalong2 & 0x02 ? "target" : "source", cmdSource->GetTypeId()); + break; + } + + Unit* spellSource = (Unit*)cmdSource; + //TODO: when GO cast implemented, code below must be updated accordingly to also allow GO spell cast - ((Unit*)source)->CastSpell(spellTarget,step.script->datalong,false); + spellSource->CastSpell(spellTarget,step.script->datalong,false); break; } diff --git a/src/game/World.h b/src/game/World.h index 408c571d9b0..b1bdcb0e7b3 100644 --- a/src/game/World.h +++ b/src/game/World.h @@ -338,12 +338,11 @@ enum RealmZone #define SCRIPT_COMMAND_CLOSE_DOOR 12 // source = unit, datalong=db_guid, datalong2=reset_delay #define SCRIPT_COMMAND_ACTIVATE_OBJECT 13 // source = unit, target=GO #define SCRIPT_COMMAND_REMOVE_AURA 14 // source (datalong2!=0) or target (datalong==0) unit, datalong = spell_id -#define SCRIPT_COMMAND_CAST_SPELL 15 // source (datalong2!=0) or target (datalong==0) unit, datalong = spell_id +#define SCRIPT_COMMAND_CAST_SPELL 15 // source/target cast spell at target/source (script->datalong2: 0: s->t 1: s->s 2: t->t 3: t->s #define SCRIPT_COMMAND_LOAD_PATH 16 // source = unit, path = datalong, repeatable datalong2 #define SCRIPT_COMMAND_CALLSCRIPT_TO_UNIT 17 // datalong scriptid, lowguid datalong2, dataint table #define SCRIPT_COMMAND_PLAYSOUND 18 // datalong soundid, datalong2 play only self - /// Storage class for commands issued for delayed execution struct CliCommandHolder { diff --git a/src/shared/revision_nr.h b/src/shared/revision_nr.h index 9c40bc3f0e6..ddb71d437fe 100644 --- a/src/shared/revision_nr.h +++ b/src/shared/revision_nr.h @@ -1,4 +1,4 @@ #ifndef __REVISION_NR_H__ #define __REVISION_NR_H__ - #define REVISION_NR "7304" + #define REVISION_NR "7305" #endif // __REVISION_NR_H__ |