📄 relicutil.cpp
字号:
#include "RelicUtil.h"#include "Zone.h"#include "Creature.h"#include "Corpse.h"#include "Effect.h"#include "BloodBible.h"#include "CastleSymbol.h"#include "Inventory.h"#include "Player.h"#include "PlayerCreature.h"#include "ZoneInfoManager.h"#include "ZoneGroupManager.h"#include "CombatInfoManager.h"#include "CastleInfoManager.h"#include "HolyLandManager.h"#include "StringPool.h"#include "EffectHasVampireRelic.h"#include "EffectHasSlayerRelic.h"#include "EffectHasBloodBible.h"#include "EffectHasCastleSymbol.h"#include "EffectRelicPosition.h"#include "EffectRelicLock.h"#include "Gpackets/GCSystemMessage.h"#include "Gpackets/GCAddEffect.h"#include "Gpackets/GCAddEffectToTile.h"#include "Gpackets/GCDeleteInventoryItem.h"#include <stdio.h>voidsendBloodBibleEffect( Object* pObject, Effect::EffectClass EClass ) throw (Error){ __BEGIN_TRY Assert(pObject!=NULL); switch (pObject->getObjectClass()) { case Object::OBJECT_CLASS_CREATURE : { Creature* pCreature = dynamic_cast<Creature*>(pObject); Assert(pCreature!=NULL); GCAddEffect gcAddEffect; gcAddEffect.setEffectID( EClass ); gcAddEffect.setObjectID( pCreature->getObjectID() ); pCreature->getZone()->broadcastPacket( pCreature->getX(), pCreature->getY(), &gcAddEffect ); } break; case Object::OBJECT_CLASS_ITEM : { Item* pItem = dynamic_cast<Item*>(pObject); Assert(pItem!=NULL); if ( pItem->getItemClass() == Item::ITEM_CLASS_CORPSE ) { Corpse* pCorpse = dynamic_cast<Corpse*>(pItem); Assert(pCorpse!=NULL); GCAddEffect gcAddEffect; gcAddEffect.setEffectID( EClass ); gcAddEffect.setObjectID( pCorpse->getObjectID() ); pCorpse->getZone()->broadcastPacket( pCorpse->getX(), pCorpse->getY(), &gcAddEffect ); } } break; default : return; } __END_CATCH}// 萍葛福巢悼 // 浇饭捞绢 ( 37, 163 ) // 轨颇捞绢 ( 193, 46 ) //// 酒淬狼 己瘤 悼<轨颇捞绢> ( 239, 134) // 酒淬狼 己瘤 辑<浇饭捞绢> ( 27, 133 ) voidsendHolyLandWarpEffect( Creature* pCreature ) throw (Error){ __BEGIN_TRY Assert(pCreature!=NULL); bool bSend = false; Distance_t limitDist = 15; Effect::EffectClass EClass; ZoneID_t zoneID = pCreature->getZoneID(); ZoneCoord_t x, y; if (pCreature->isSlayer()) { const int maxHolyLandWarpSlayer = 1; static ZONE_COORD HolyLandWarpSlayer[ maxHolyLandWarpSlayer ] = { ZONE_COORD( 53, 37, 163 ), // 萍葛福 巢悼// ZONE_COORD( 73, 27, 133 ) // 酒淬狼 己瘤 辑率 }; for (int i=0; i<maxHolyLandWarpSlayer; i++) { const ZONE_COORD& zoneCoord = HolyLandWarpSlayer[i]; x = zoneCoord.x; y = zoneCoord.y; if (zoneID == zoneCoord.id && pCreature->getDistance(x, y) < limitDist) { bSend = true; break; } } EClass = Effect::EFFECT_CLASS_WARP_HOLY_LAND_SLAYER; } else if (pCreature->isVampire()) { const int maxHolyLandWarpVampire = 1; static ZONE_COORD HolyLandWarpVampire[ maxHolyLandWarpVampire ] = { ZONE_COORD( 53, 193, 46 ), // 萍葛福 巢悼// ZONE_COORD( 71, 239, 134 ) // 酒淬狼 己瘤 悼率 }; for (int i=0; i<maxHolyLandWarpVampire; i++) { const ZONE_COORD& zoneCoord = HolyLandWarpVampire[i]; x = zoneCoord.x; y = zoneCoord.y; if (zoneID == zoneCoord.id && pCreature->getDistance(x, y) < limitDist) { bSend = true; break; } } EClass = Effect::EFFECT_CLASS_WARP_HOLY_LAND_VAMPIRE; } else if (pCreature->isOusters()) { // 澜衬 攫哩啊 秦拎具 窃 ~_~ // 酒快胶磐令绰 酒淬狼 己瘤 绢叼俊 冻备瘤 ぱ.,ぱ const int maxHolyLandWarpOusters = 1; static ZONE_COORD HolyLandWarpOusters[ maxHolyLandWarpOusters ] = { ZONE_COORD( 53, 160, 170 ), // 萍葛福 巢悼// ZONE_COORD( 72, 129, 112 ) // 酒淬狼 己瘤 吝居 }; for (int i=0; i<maxHolyLandWarpOusters; i++) { const ZONE_COORD& zoneCoord = HolyLandWarpOusters[i]; x = zoneCoord.x; y = zoneCoord.y; if (zoneID == zoneCoord.id && pCreature->getDistance(x, y) < limitDist) { bSend = true; break; } } EClass = Effect::EFFECT_CLASS_WARP_HOLY_LAND_OUSTERS; } if (bSend) { GCAddEffectToTile gcAddEffectToTile; gcAddEffectToTile.setEffectID( EClass ); gcAddEffectToTile.setObjectID( pCreature->getObjectID() ); gcAddEffectToTile.setXY( x, y ); gcAddEffectToTile.setDuration( 21 ); pCreature->getZone()->broadcastPacket( x, y, &gcAddEffectToTile ); } __END_CATCH}bool addEffectRelicPosition( Item* pItem, ZoneID_t zoneID, TPOINT pt ) throw(Error){ __BEGIN_TRY if (!pItem->isFlag( Effect::EFFECT_CLASS_RELIC_POSITION)) { EffectRelicPosition* pPosition = new EffectRelicPosition(pItem); //pPosition->setNextTime(10); // 1檬 饶 皋技瘤 谎赴促. pPosition->setTick( 1*60*10 ); // 1盒付促 茄锅究 舅赴促. pPosition->setZoneID( zoneID ); pPosition->setX( pt.x ); pPosition->setY( pt.y ); pPosition->setPart( pItem->getItemType() ); pItem->setFlag( Effect::EFFECT_CLASS_RELIC_POSITION ); pItem->getEffectManager().addEffect( pPosition ); pPosition->affect(); return true; } return false; __END_CATCH}booldeleteEffectRelicPosition( Item* pItem ) throw (Error){ __BEGIN_TRY Assert(pItem!=NULL); // EffectRelicPosition 力芭茄促. // 己拱 焊包措俊 嘿绢乐带 Effect甫 力芭茄促. if (pItem->isFlag(Effect::EFFECT_CLASS_RELIC_POSITION)) { Effect* pPositionEffect = pItem->getEffectManager().findEffect(Effect::EFFECT_CLASS_RELIC_POSITION); Assert(pPositionEffect != NULL); pPositionEffect->unaffect(); pItem->removeFlag(Effect::EFFECT_CLASS_RELIC_POSITION); pItem->getEffectManager().deleteEffect(Effect::EFFECT_CLASS_RELIC_POSITION); return true; } return false; __END_CATCH}// Corpse嘿篮 pItem苞 包访等 Effect甫 绝局霖促.booldeleteRelicEffect(Corpse* pCorpse, Item* pItem) throw (Error){ __BEGIN_TRY Assert(pCorpse!=NULL); Assert(pItem!=NULL); Effect::EffectClass EClass; switch (pItem->getItemClass()) { case Item::ITEM_CLASS_RELIC : { const RelicInfo* pRelicInfo = dynamic_cast<RelicInfo*>(g_pRelicInfoManager->getItemInfo( pItem->getItemType() ) ); Assert( pRelicInfo != NULL ); if ( pRelicInfo->relicType == RELIC_TYPE_SLAYER ) EClass = Effect::EFFECT_CLASS_HAS_SLAYER_RELIC; else if ( pRelicInfo->relicType == RELIC_TYPE_VAMPIRE ) EClass = Effect::EFFECT_CLASS_HAS_VAMPIRE_RELIC; else throw Error("肋给等 Relic Item Type 涝聪促."); } break; case Item::ITEM_CLASS_BLOOD_BIBLE : EClass = Effect::EFFECT_CLASS_HAS_BLOOD_BIBLE; break; case Item::ITEM_CLASS_CASTLE_SYMBOL : EClass = Effect::EFFECT_CLASS_HAS_CASTLE_SYMBOL; break; default : return false; } pCorpse->removeFlag( EClass ); EffectManager& effectManager = pCorpse->getEffectManager(); Effect* pEffect = effectManager.findEffect( EClass ); if (pEffect!=NULL) { pEffect->unaffect(); effectManager.deleteEffect( EClass ); } return true; __END_CATCH}voidsaveItemInCorpse(Item* pItem, Corpse* pCorpse) throw (Error){ __BEGIN_TRY Assert(pItem!=NULL); Assert(pCorpse!=NULL); if (pItem->getItemClass()==Item::ITEM_CLASS_BLOOD_BIBLE || pItem->getItemClass()==Item::ITEM_CLASS_CASTLE_SYMBOL || pItem->isFlagItem() || pItem->getItemClass()==Item::ITEM_CLASS_SWEEPER) { Zone* pZone = pCorpse->getZone(); Assert(pZone!=NULL); char pField[80]; pZone->registerObject( pItem ); sprintf(pField, "ObjectID = %lu, OwnerID='%d', Storage=%d, StorageID=%lu", pItem->getObjectID(), (int)pZone->getZoneID(), (int)STORAGE_CORPSE, pCorpse->getObjectID()); pItem->tinysave( pField ); } __END_CATCH}bool isRelicItem(const Item* pItem){ if (pItem!=NULL) { Item::ItemClass IClass = pItem->getItemClass(); return isRelicItem( IClass ); } return false;}bool isRelicItem(Item::ItemClass IClass){ if (IClass==Item::ITEM_CLASS_RELIC || IClass==Item::ITEM_CLASS_BLOOD_BIBLE || IClass==Item::ITEM_CLASS_CASTLE_SYMBOL) { return true; } return false;}// Zone俊 乐绰 pCorpse啊 pItem阑 啊瘤绊 乐促.booladdHasRelicEffect(Zone* pZone, Corpse* pCorpse, Item* pItem) throw (Error){ __BEGIN_TRY if (pZone==NULL) return false; Assert(pCorpse!=NULL); Assert(pItem!=NULL); EffectHasRelic* pRelicEffect = NULL; // 己窜捞 己辑甫 啊瘤绊 乐促绰 钎矫 switch (pItem->getItemClass()) { case Item::ITEM_CLASS_BLOOD_BIBLE : { pRelicEffect = new EffectHasBloodBible( pCorpse ); } break; case Item::ITEM_CLASS_CASTLE_SYMBOL : { pRelicEffect = new EffectHasCastleSymbol( pCorpse ); } break; default : return false; } pRelicEffect->setZone( pZone ); pRelicEffect->setXY( pCorpse->getX(), pCorpse->getY() ); //pRelicEffect->setNextTime( 1*10 ); // 1檬 饶 pRelicEffect->setTick( 1*60*10 ); // 1盒付促 皋技瘤 免仿 pRelicEffect->setPart( pItem->getItemType() ); pRelicEffect->affect(); EffectManager& effectManager = pCorpse->getEffectManager(); pCorpse->setFlag( pRelicEffect->getEffectClass() ); effectManager.addEffect( pRelicEffect ); // 捞棋飘甫 嘿咯林扼绊 茄促. GCAddEffect gcAddEffect; gcAddEffect.setObjectID( pCorpse->getObjectID() ); gcAddEffect.setEffectID( pRelicEffect->getSendEffectClass() ); gcAddEffect.setDuration( 65000 ); pZone->broadcastPacket(pCorpse->getX(), pCorpse->getY(), &gcAddEffect); return true; __END_CATCH}bool deleteRelicEffect(Creature* pCreature, Item* pItem) throw (Error){ __BEGIN_TRY Assert(pItem!=NULL); Assert(pCreature!=NULL); Effect::EffectClass effectClass; if (pItem->getItemClass()==Item::ITEM_CLASS_RELIC) { const RelicInfo* pRelicInfo = dynamic_cast<RelicInfo*>(g_pRelicInfoManager->getItemInfo( pItem->getItemType() ) ); Assert( pRelicInfo != NULL ); if ( pRelicInfo->relicType == RELIC_TYPE_SLAYER ) effectClass = Effect::EFFECT_CLASS_HAS_SLAYER_RELIC; else if ( pRelicInfo->relicType == RELIC_TYPE_VAMPIRE ) effectClass = Effect::EFFECT_CLASS_HAS_VAMPIRE_RELIC; else throw Error("肋给等 Relic Item Type 涝聪促."); } else if (pItem->getItemClass()==Item::ITEM_CLASS_BLOOD_BIBLE) { effectClass = Effect::EFFECT_CLASS_HAS_BLOOD_BIBLE; } else if (pItem->getItemClass()==Item::ITEM_CLASS_CASTLE_SYMBOL) { effectClass = Effect::EFFECT_CLASS_HAS_CASTLE_SYMBOL; }
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -