⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 effectbloodysnake.cpp

📁 天之炼狱1服务器端源文件游戏服务端不完整
💻 CPP
字号:
//////////////////////////////////////////////////////////////////////////////// Filename    : EffectBloodySnake.cpp// Written by  :// Description : //////////////////////////////////////////////////////////////////////////////#include "EffectBloodySnake.h"#include "Slayer.h"#include "Vampire.h"#include "Monster.h"#include "GamePlayer.h"#include "SkillUtil.h"#include "ZoneUtil.h"#include "Gpackets/GCModifyInformation.h"#include "Gpackets/GCStatusCurrentHP.h"#include "Gpackets/GCAddEffectToTile.h"POINT EffectBloodySnake::getNextPosition(){	Dir_t dir = m_Dir;	if (rand()%5<2)	{		dir = (dir+(rand()%2==0? 1 : DIR_MAX-1))%DIR_MAX;	}	const POINT& pt = dirMoveMask[dir];	return POINT(m_X+pt.x, m_Y+pt.y);}////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////EffectBloodySnake::EffectBloodySnake(Zone* pZone, ZoneCoord_t zoneX, ZoneCoord_t zoneY) 	throw(Error){	__BEGIN_TRY	m_pZone = pZone;	m_X = zoneX;	m_Y = zoneY;	m_Dir = DOWN;	m_CasterName ="";	m_CasterID = 0;	m_CreatureClass = Creature::CREATURE_CLASS_VAMPIRE;	m_ClanID = 0;	__END_CATCH}////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////void EffectBloodySnake::affect()	throw(Error){	__BEGIN_TRY	//cout << "EffectBloodySnake" << "affect BEGIN" << endl;		Assert(m_pZone != NULL);	// 胶懦 荤侩磊甫 啊廉柯促.	// !! 捞固 粮阑 栋车阑 荐档 乐栏骨肺 NULL 捞 瞪 荐 乐促.	// by bezz. 2003.1.4	Creature* pCastCreature = m_pZone->getCreature( m_CasterID );	// 泅犁 捞棋飘啊 嘿绢乐绰 鸥老阑 罐酒柯促.    Tile& tile = m_pZone->getTile(m_X, m_Y);	// 鸥老 救俊 粮犁窍绰 坷宏璃飘甸阑 八祸茄促.    const slist<Object*>& oList = tile.getObjectList();	slist<Object*>::const_iterator itr = oList.begin();    for (; itr != oList.end(); itr++) 	{		Assert(*itr != NULL);		Object* pObject = *itr;		Assert(pObject != NULL);    	if (pObject->getObjectClass() == Object::OBJECT_CLASS_CREATURE)		{			Creature* pCreature = dynamic_cast<Creature*>(pObject);			Assert(pCreature != NULL);			// 公利惑怕 眉农. by sigi. 2002.9.5			// 魂 搁开. by sigi. 2002.9.13			// 磊扁 磊脚捞搁 救 嘎绰促.			if (pCreature->isFlag(Effect::EFFECT_CLASS_NO_DAMAGE)				|| pCreature->getObjectID()==m_CasterID)			{				continue;			}						// 鞍篮 炼流(--;)捞搁 救 嘎绰促.			if (m_CreatureClass==pCreature->getCreatureClass())			{				if (m_CreatureClass==Creature::CREATURE_CLASS_MONSTER)				{					Creature* pAttacker = m_pZone->getCreature( m_CasterID );					if (pAttacker!=NULL)					{						Monster* pAttackMonster = dynamic_cast<Monster*>(pAttacker);						Monster* pDefendMonster = dynamic_cast<Monster*>(pCreature);						if (pAttackMonster->getClanType()==pDefendMonster->getClanType())						{							continue;						}					}				}			}			int Damage = m_Damage;			if (pCreature->getMoveMode() != Creature::MOVE_MODE_FLYING)			{				if (pCreature->isSlayer()) 				{					Slayer* pSlayer = dynamic_cast<Slayer*>(pCreature);					GCModifyInformation gcMI;					::setDamage( pSlayer, Damage, pCastCreature, SKILL_BLOODY_SNAKE, &gcMI );					Player* pPlayer = pSlayer->getPlayer();					Assert(pPlayer != NULL);					pPlayer->sendPacket(&gcMI);					// knockback眉农					bool bKnockback = rand()%100 < 20;	// 20%狼 犬伏肺 knockback					if (bKnockback)					{						int x = pCreature->getX() + rand()%3 - 1;						int y = pCreature->getY() + rand()%3 - 1;						knockbackCreature(m_pZone, pCreature, x, y);						// Tile狼 oList甫 官差霸 窍骨肺 歹 眉农窍瘤 臼绰促. 						// 茄 鸥老俊辑 窍唱啊 knockback登搁 第俊 眉农且 局甸篮 救 嘎酒档 包拌绝瘤~						break;					}				} 				else if (pCreature->isVampire())				{					Vampire* pVampire = dynamic_cast<Vampire*>(pCreature);					GCModifyInformation gcMI;					::setDamage( pVampire, Damage, pCastCreature, SKILL_BLOODY_SNAKE, &gcMI );					Player* pPlayer = pVampire->getPlayer();					Assert(pPlayer != NULL);					pPlayer->sendPacket(&gcMI);					// knockback眉农					bool bKnockback = rand()%100 < 20;	// 20%狼 犬伏肺 knockback					if (bKnockback)					{						int x = pCreature->getX() + rand()%3 - 1;						int y = pCreature->getY() + rand()%3 - 1;						knockbackCreature(m_pZone, pCreature, x, y);						// Tile狼 oList甫 官差霸 窍骨肺 歹 眉农窍瘤 臼绰促. 						// 茄 鸥老俊辑 窍唱啊 knockback登搁 第俊 眉农且 局甸篮 救 嘎酒档 包拌绝瘤~						break;					}				}				else if (pCreature->isOusters())				{					Ousters* pOusters = dynamic_cast<Ousters*>(pCreature);					GCModifyInformation gcMI;					::setDamage( pOusters, Damage, pCastCreature, SKILL_BLOODY_SNAKE, &gcMI );					Player* pPlayer = pOusters->getPlayer();					Assert(pPlayer != NULL);					pPlayer->sendPacket(&gcMI);					// knockback眉农					bool bKnockback = rand()%100 < 20;	// 20%狼 犬伏肺 knockback					if (bKnockback)					{						int x = pCreature->getX() + rand()%3 - 1;						int y = pCreature->getY() + rand()%3 - 1;						knockbackCreature(m_pZone, pCreature, x, y);						// Tile狼 oList甫 官差霸 窍骨肺 歹 眉农窍瘤 臼绰促. 						// 茄 鸥老俊辑 窍唱啊 knockback登搁 第俊 眉农且 局甸篮 救 嘎酒档 包拌绝瘤~						break;					}				}				else if (pCreature->isMonster())				{					Monster* pMonster = dynamic_cast<Monster*>(pCreature);					::setDamage( pMonster, Damage, pCastCreature, SKILL_BLOODY_SNAKE );					// knockback眉农					bool bKnockback = rand()%100 < 20;	// 20%狼 犬伏肺 knockback					if (bKnockback)					{						int x = pCreature->getX() + rand()%3 - 1;						int y = pCreature->getY() + rand()%3 - 1;						knockbackCreature(m_pZone, pCreature, x, y);						// Tile狼 oList甫 官差霸 窍骨肺 歹 眉农窍瘤 臼绰促. 						// 茄 鸥老俊辑 窍唱啊 knockback登搁 第俊 眉农且 局甸篮 救 嘎酒档 包拌绝瘤~						break;					}				}				// m_CasterName捞 pCreature甫 磷牢 版快狼 KillCount 贸府				// by sigi. 2002.8.31/*				if (pCreature->isDead())				{					Creature* pAttacker = m_pZone->getCreature( m_CasterID );					if (pAttacker!=NULL)					{ 						affectKillCount(pAttacker, pCreature);					}				}*/			}		}	}	// 促澜 捞悼 谅钎 拌魂	POINT pt = getNextPosition();	/*	cout << "EffectSnake(" << m_ObjectID << ")"		<< "[" << Dir2String[m_Dir].c_str() << "] ("		<< m_X << ", " << m_Y << ") --> ("		<< pt.x << ", " << pt.y << ")" << endl;	*/	// 促澜 捞悼且 鸥老俊 眠啊茄促.	VSRect rect(0, 0, m_pZone->getWidth()-1, m_pZone->getHeight()-1);	if (rect.ptInRect(pt.x, pt.y))	{		Tile& newTile = m_pZone->getTile( pt.x, pt.y );		if ((!newTile.isGroundBlocked()			|| newTile.hasCreature(Creature::MOVE_MODE_WALKING))			&& newTile.canAddEffect())		{			// 鞍篮 effect啊 乐栏搁 瘤款促.			Effect* pOldEffect = newTile.getEffect(Effect::EFFECT_CLASS_BLOODY_SNAKE);			if (pOldEffect != NULL && pOldEffect!=this)			{				ObjectID_t effectID = pOldEffect->getObjectID();				m_pZone->deleteEffect(effectID);// fix me			}					// 扁粮 鸥老俊辑 瘤快绊			tile.deleteEffect(m_ObjectID);						// 货 鸥老俊 眠啊茄促.			newTile.addEffect(this);			m_X = pt.x;			m_Y = pt.y;			GCAddEffectToTile gcAddEffectToTile;			gcAddEffectToTile.setEffectID( Effect::EFFECT_CLASS_BLOODY_SNAKE );			gcAddEffectToTile.setDuration( m_Tick+(m_Tick>>1) );			gcAddEffectToTile.setObjectID( m_ObjectID );			gcAddEffectToTile.setXY( m_X, m_Y );			m_pZone->broadcastPacket(m_X, m_Y, &gcAddEffectToTile);				setNextTime(m_Tick);		}		else		{			setDeadline( 0 );		}	}	else	{		setDeadline( 0 );	}	//cout << "EffectBloodySnake" << "affect END" << endl;	__END_CATCH }////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////void EffectBloodySnake::affect(Creature* pCreature)	throw(Error){	__BEGIN_TRY	__END_CATCH}////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////void EffectBloodySnake::affect(Zone* pZone , ZoneCoord_t x , ZoneCoord_t y , Object* pObject)	throw(Error){	__BEGIN_TRY	__END_CATCH}////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////void EffectBloodySnake::unaffect(Creature* pCreature)	throw(Error){	__BEGIN_TRY	__END_CATCH}////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////void EffectBloodySnake::unaffect()	throw(Error){	__BEGIN_TRY	//cout << "EffectBloodySnake" << "unaffect BEGIN" << endl;    Tile& tile = m_pZone->getTile(m_X, m_Y);	tile.deleteEffect(m_ObjectID);	//cout << "EffectBloodySnake" << "unaffect END" << endl;	__END_CATCH}////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////void EffectBloodySnake::unaffect(Zone* pZone , ZoneCoord_t x , ZoneCoord_t y , Object* pObject)	throw(Error){	__BEGIN_TRY	__END_CATCH}////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////string EffectBloodySnake::toString()	const throw(){	__BEGIN_TRY	StringStream msg;	msg << "EffectBloodySnake("		<< "ObjectID:" << getObjectID()		<< ")";	return msg.toString();	__END_CATCH}EffectBloodySnakeLoader* g_pEffectBloodySnakeLoader = NULL;

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -