.\zone\spdat.h
After:
Code:
int GetMinLevel(int16 spell_id);
int CalcBuffDuration_formula(int level, int formula, int duration);
sint32 CalculatePoisonCounters(int16 spell_id);
sint32 CalculateDiseaseCounters(int16 spell_id);
sint32 CalculateCurseCounters(int16 spell_id);
bool IsDiscipline(int16 spell_id);
bool IsResurrectionEffects(int16 spell_id);
bool IsRuneSpell(int16 spell_id);
bool IsMagicRuneSpell(int16 spell_id);
Add:
Code:
bool IsShadowStepSpell(int16 spell_id);
bool IsSuccorSpell(int16 spell_id);
bool IsTeleportSpell(int16 spell_id);
bool IsGateSpell(int16 spell_id);
.\zone\spdat.cpp
After:
Code:
bool IsRuneSpell(int16 spell_id) {
bool Result = false;
if(IsValidSpell(spell_id)) {
for(int i = 0; i < EFFECT_COUNT; i++) {
if(spells[spell_id].effectid[i] == SE_Rune) {
Result = true;
break;
}
}
}
return Result;
}
Add:
Code:
bool IsShadowStepSpell(int16 spell_id) {
if (IsEffectInSpell(spell_id, SE_ShadowStep)){
return true;
}
else {
return false;
}
}
bool IsSuccorSpell(int16 spell_id) {
if (IsEffectInSpell(spell_id, SE_Succor)){
return true;
}
else {
return false;
}
}
bool IsTeleportSpell(int16 spell_id) {
if (IsEffectInSpell(spell_id, SE_Teleport)){
return true;
}
else {
return false;
}
}
bool IsGateSpell(int16 spell_id) {
if (IsEffectInSpell(spell_id, SE_Gate)){
return true;
}
else {
return false;
}
}
.\zone\spell_effects.cpp
Change (Insert Red Lines):
Code:
case SE_SummonPC:
{
if(IsClient()){
CastToClient()->cheat_timer.Start(3500, false); //Lieka: Exempt spells the "SummonPC" effect from triggering the MQWarp detector.
CastToClient()->MovePC(zone->GetZoneID(), caster->GetX(), caster->GetY(), caster->GetZ(), caster->GetHeading(), 2, SummonPC);
Message(15, "You have been summoned!");
} else {
caster->Message(13, "This spell can only be cast on players.");
}
break;
}
.\zone\spells.cpp
Change (Insert Red Lines):
Code:
if(bard_song_mode)
{
if(IsClient())
{
this->CastToClient()->CheckSongSkillIncrease(spell_id);
//Lieka start Edit: Fixing Warp Detector triggered for Bard Songs
if ((IsGateSpell(spell_id)) ||//Lieka Edit Begin: Checking effects within the spell, rather than hardcoding Spell IDs.
(IsTeleportSpell(spell_id)) ||
(IsSuccorSpell(spell_id)) ||
(IsShadowStepSpell(spell_id)) ||
(IsGateSpell(spell_id)))
{
this->cheat_timer.Start(2000,false); //Lieka: Exempt above effects from setting off MQWarp detector due to intrazone movement generated from the bard song effects
}
//Lieka end edit.
}
// go again in 6 seconds
//this is handled with bardsong_timer
// DoCastSpell(casting_spell_id, casting_spell_targetid, casting_spell_slot, 6000, casting_spell_mana);
mlog(SPELLS__CASTING, "Bard song %d should be started", spell_id);
}
else
After:
Code:
else
{
if(IsClient())
{
Client *c = CastToClient();
SendSpellBarEnable(spell_id);
// this causes the delayed refresh of the spell bar gems
c->MemorizeSpell(slot, spell_id, memSpellSpellbar);
// this tells the client that casting may happen again
SetMana(GetMana());
// skills
if(slot < MAX_PP_MEMSPELL)
{
c->CheckIncreaseSkill(spells[spell_id].skill);
// increased chance of gaining channel skill if you regained concentration
c->CheckIncreaseSkill(CHANNELING, regain_conc ? 5 : 0);
c->CheckSpecializeIncrease(spell_id);
}
Add:
Code:
if ((IsGateSpell(spell_id)) ||//Lieka Edit Begin: Checking effects within the spell, rather than hardcoding Spell IDs.
(IsTeleportSpell(spell_id)) ||
(IsSuccorSpell(spell_id)) ||
(IsShadowStepSpell(spell_id)) ||
(IsGateSpell(spell_id)))
{
c->cheat_timer.Start(2000,false); //Lieka: Exempt above effects from setting off MQWarp detector due to intrazone movement generated from the spell effects
}
After:
Code:
if // Bind Sight line of spells
(
spell_id == 500 || // bind sight
spell_id == 407 // cast sight
)
{
action->target = GetID();
}
else
{
action->target = spelltar->GetID();
}
action->level = caster_level; // caster level, for animation only
action->type = 231; // 231 means a spell
action->spell = spell_id;
action->sequence = (int32) (GetHeading() * 2); // just some random number
action->instrument_mod = GetInstrumentMod(spell_id);
action->buff_unknown = 0;
Add:
Code:
//Lieka start Edit: Fixing Warp Detector triggered by spells cast on the player.
if ((IsGateSpell(spell_id)) ||//Lieka Edit Begin: Checking effects within the spell, rather than hardcoding Spell IDs.
(IsTeleportSpell(spell_id)) ||
(IsSuccorSpell(spell_id)) ||
(IsShadowStepSpell(spell_id)) ||
(IsGateSpell(spell_id)))
{
spelltar->cheat_timer.Start(2000,false); //Lieka: Exempt above effects from setting off MQWarp detector due to intrazone movement generated from the spell effects
}
//Lieka end edit.
.\zone\zone.h
Change:
Code:
ZonePoint* GetClosestZonePoint(float x, float y, float z, int32 to, float max_distance = 40000.0f);
To:
Code:
ZonePoint* GetClosestZonePoint(float x, float y, float z, int32 to, float max_distance = 40000.0f, Client* client = NULL);
.\zone\zone.cpp
Change:
Code:
ZonePoint* Zone::GetClosestZonePoint(float x, float y, float z, int32 to, float max_distance) {
To:
Code:
ZonePoint* Zone::GetClosestZonePoint(float x, float y, float z, int32 to, float max_distance, Client* client) {
Change (Insert Red Lines):
Code:
if(closest_dist>(200.0f*200.0f) && closest_dist<max_distance2)
{
client->CheatDetected(MQZone); //[Paddy] Someone is trying to use /zone
LogFile->write(EQEMuLog::Status, "WARNING: Closest zone point for zone id %d is %f, you might need to update your zone_points table if you dont arrive at the right spot.",to,closest_dist);
LogFile->write(EQEMuLog::Status, "<Real Zone Points>. %f x %f y %fz ",x,y,z);
//worldserver.SendEmoteMessage(0,0,0,13,"<Real Zone Points>. %f x %f y %fz ",x,y,z);
closest_zp = NULL; //Lieka: Prevent the zone request from happening.
}
if(closest_dist > max_distance2)
closest_zp = NULL;
if(!closest_zp)
closest_zp = GetClosestZonePointWithoutZone(x,y,z);
return closest_zp;
}