Exemple #1
0
int CLifeStone::CreateLifeStone(int iIndex)
{
	LPOBJ lpObj = &gObj[iIndex];
	int iMonsterIndex = -1;
	BYTE cX = lpObj->X;
	BYTE cY = lpObj->Y;

	if ( g_CastleSiegeSync.GetCastleState() != CASTLESIEGE_STATE_STARTSIEGE )
	{
		MsgOutput(iIndex, lMsg.Get(1645));
		return FALSE;
	}

	if ( lpObj->GuildStatus != G_MASTER )
	{
		return FALSE;
	}

	if ( lpObj->m_btCsJoinSide < 2 )
	{
		MsgOutput(iIndex, lMsg.Get(1641)); //HermeX Fix
		return FALSE;
	}

	if ( lpObj->lpGuild->lpLifeStone  ) //HermeX Fix
	{
		MsgOutput(iIndex, lMsg.Get(1642)); //HermeX Fix
		return FALSE;
	}
	
	if( cX > 150 && cX < 210 && cY > 175 && cY < 230 )
	{
		MsgOutput(iIndex, lMsg.Get(1644)); //HermeX Fix
		return FALSE;
	}

	BYTE btMapAttr = MapC[lpObj->MapNumber].GetAttr(cX, cY);
	
	if ( btMapAttr & 16 != 16 ) //siege camp?
	{
		//return FALSE;
	}

	if ( gObj[iIndex].MapNumber != MAP_INDEX_CASTLESIEGE )
	{
		MsgOutput(iIndex, lMsg.Get(1627)); //HermeX Fix
		return FALSE;
	}
	
	iMonsterIndex = gObjAddMonster(lpObj->MapNumber);

	if ( iMonsterIndex >= 0 )
	{
	
		MONSTER_ATTRIBUTE * MAttr = gMAttr.GetAttr(278);
	
		if ( MAttr == NULL )
		{
			gObjDel(iMonsterIndex);
			return FALSE;
		}

		gObjSetMonster(iMonsterIndex, 278);
		gObj[iMonsterIndex].Live = TRUE;
		gObj[iMonsterIndex].Life = MAttr->m_Hp;
		gObj[iMonsterIndex].MaxLife = MAttr->m_Hp;
		gObj[iMonsterIndex].m_PosNum = -1;
		gObj[iMonsterIndex].X = cX;
		gObj[iMonsterIndex].Y = cY;
		gObj[iMonsterIndex].MTX = cX;
		gObj[iMonsterIndex].MTY = cY;
		gObj[iMonsterIndex].TX = cX;
		gObj[iMonsterIndex].TY = cY;
		gObj[iMonsterIndex].m_OldX = cX;
		gObj[iMonsterIndex].m_OldY = cY;
		gObj[iMonsterIndex].StartX = cX;
		gObj[iMonsterIndex].StartY = cY;
		gObj[iMonsterIndex].MapNumber = lpObj->MapNumber;
		gObj[iMonsterIndex].m_MoveRange = 0;
		gObj[iMonsterIndex].Level = MAttr->m_Level;
		gObj[iMonsterIndex].Type = OBJ_MONSTER;
		gObj[iMonsterIndex].MaxRegenTime = 1000;
		gObj[iMonsterIndex].Dir = 1;
		gObj[iMonsterIndex].RegenTime = GetTickCount();
		gObj[iMonsterIndex].m_Attribute = 0;
		gObj[iMonsterIndex].DieRegen = 0;
		gObj[iMonsterIndex].m_btCsNpcType = OBJ_NPC; //HermeX Fix
		gObj[iMonsterIndex].m_btCsJoinSide = lpObj->m_btCsJoinSide;
		gObj[iMonsterIndex].lpGuild = lpObj->lpGuild;
		gObj[iMonsterIndex].m_btCreationState = 0;

		lpObj->lpGuild->lpLifeStone = &gObj[iMonsterIndex]; //SirMaster Fix
		gObj[iMonsterIndex].m_iCreatedActivationTime = 0; //new

		MsgOutput(iIndex, lMsg.Get(1646));
		LogAddTD("[CastleSiege] LifeStone is created - [%s] [%s][%s] (Map:%d)(X:%d, Y:%d)",lpObj->lpGuild->Name,
		lpObj->AccountID,lpObj->Name,lpObj->MapNumber,cX,cY);
		lpObj->m_btLifeStoneCount++;
	}
	else
	{
		MsgOutput(iIndex, lMsg.Get(1647));
		return FALSE;
	}
	return TRUE;
}
Exemple #2
0
//00414B10 - identical
BOOL CKalimaGate::CreateKalimaGate(int iIndex, BYTE btLevel, BYTE cTX, BYTE cTY)
{
	BOOL bKalimaGateCreateSucceed=FALSE;
	int iMonsterIndex=-1;

	
	EnterCriticalSection(&this->m_critKalimaGate );
	
	__try
	{
		int iKalimaGateLevel;
		int iMapNumber;
		BYTE btMapAttr;
		int iMonsterType;
		BYTE cX;
		BYTE cY;

		
		if ( gObjIsConnected(iIndex) == PLAYER_EMPTY )
		{
			return false;
		}

		LogAddTD("[Kalima] [%s][%s] Try to Create Kalima Gate", gObj[iIndex].AccountID, gObj[iIndex].Name);
		iKalimaGateLevel = this->GetKalimaGateLevel(iIndex);

		if ( iKalimaGateLevel < btLevel-1 )
		{
			return false;
		}

		iKalimaGateLevel = btLevel-1;

		if (  DS_MAP_RANGE(gObj[iIndex].MapNumber) )
		{
			return false;
		}

		if ( BC_MAP_RANGE(gObj[iIndex].MapNumber) )
		{
			return false;
		}

		if ( CC_MAP_RANGE(gObj[iIndex].MapNumber) )
		{
			return false;
		}

		if ( CHECK_ILLUSIONTEMPLE(gObj[iIndex].MapNumber) )//NEW
		{
			return false;
		}

#ifdef IMPERIAL
		if( CImperialGuardian::IsEventMap(gObj[iIndex].MapNumber) )
		{
			return false;
		}
#endif

		if ( KALIMA_FLOOR_RANGE(iKalimaGateLevel)== FALSE )
		{
			LogAddTD("[Kalima] [%s][%s] Failed to Summon Kalima Gate - Gate Level Check Error : %d",
				gObj[iIndex].AccountID, gObj[iIndex].Name, iKalimaGateLevel+1);
			return false;
		}

		iMapNumber = gObj[iIndex].MapNumber;

		btMapAttr = MapC[iMapNumber].GetAttr(gObj[iIndex].X, gObj[iIndex].Y);

		if ( btMapAttr &1 != 0 )
		{
			LogAddTD("[Kalima] [%s][%s] Failed to Summon Kalima Gate - Called in Saftey Area (Map:%d, X:%d, Y:%d)",
				gObj[iIndex].AccountID, gObj[iIndex].Name, gObj[iIndex].MapNumber,
				gObj[iIndex].X, gObj[iIndex].Y);
			return false;
		}

		if ( gObj[iIndex].m_cKalimaGateExist == TRUE )
		{
			GCServerMsgStringSend(lMsg.Get( MSGGET( 4, 224)), iIndex, 1);
			LogAddTD("[Kalima] [%s][%s] Failed to Summon Kalima Gate - Already Have Gate (SummonIndex:%d)",
				gObj[iIndex].AccountID, gObj[iIndex].Name, gObj[iIndex].m_iKalimaGateIndex);
			return false;
		}

		iMonsterType = iKalimaGateLevel+152;
		cX = cTX;
		cY = cTY;

		btMapAttr = MapC[iMapNumber].GetAttr(cX, cY);

		if ( btMapAttr != 0 )
		{
			if (this->GetRandomLocation(iMapNumber, cX, cY) == 0)
			{
			LogAddTD("[Kalima] [%s][%s] Failed to Summon Kalima Gate - Failed to get Location (MapNumber:%d, X:%d, Y:%d)",
				gObj[iIndex].AccountID, gObj[iIndex].Name, gObj[iIndex].MapNumber, cX, cY);
			return false;
			}
		}

		if ( gObj[iIndex].MapNumber == 10 )
		{
			LogAddTD("[Kalima] [%s][%s] Failed to Summon Kalima Gate - Uable to Summon in this Map (MapNumber:%d)",
				gObj[iIndex].AccountID, gObj[iIndex].Name, gObj[iIndex].MapNumber);
			return false;
		}

		iMonsterIndex = gObjAddMonster(iMapNumber);

		if ( iMonsterIndex >= 0 )
		{
			LPMONSTER_ATTRIBUTE lpMATTR = gMAttr.GetAttr(iMonsterType);
			
			if ( lpMATTR == NULL )
			{
				gObjDel(iMonsterIndex);
				LogAddTD("[Kalima] [%s][%s] Kalima Gate Vanished - lpMATTR == NULL (SummonIndex:%d)",
					gObj[iIndex].AccountID, gObj[iIndex].Name, iMonsterIndex);
				return false;
			}

			gObjSetMonster(iMonsterIndex, iMonsterType);
			gObj[iMonsterIndex].Live = TRUE;
			gObj[iMonsterIndex].Life = 1000.0;
			gObj[iMonsterIndex].MaxLife = 1000.0;
			gObj[iMonsterIndex].m_PosNum = -1;
			gObj[iMonsterIndex].X = cX;
			gObj[iMonsterIndex].Y = cY;
			gObj[iMonsterIndex].MTX = cX;
			gObj[iMonsterIndex].MTY = cY;
			gObj[iMonsterIndex].TX = cX;
			gObj[iMonsterIndex].TY = cY;
			gObj[iMonsterIndex].m_OldX = cX;
			gObj[iMonsterIndex].m_OldY = cY;
			gObj[iMonsterIndex].StartX = cX;
			gObj[iMonsterIndex].StartY = cY;
			gObj[iMonsterIndex].MapNumber = iMapNumber;
			gObj[iMonsterIndex].m_MoveRange = 0;
			gObj[iMonsterIndex].m_cKalimaGateEnterCount = 0;

			gObj[iIndex].m_cKalimaGateExist = TRUE;
			gObj[iIndex].m_iKalimaGateIndex = iMonsterIndex;

			gObj[iMonsterIndex].Level = lpMATTR->m_Level;
			gObj[iMonsterIndex].Type = OBJ_MONSTER;
			gObj[iMonsterIndex].MaxRegenTime = 1000;
			gObj[iMonsterIndex].Dir = 1;

			gObj[iMonsterIndex].m_RecallMon = iIndex;
			gObj[iMonsterIndex].RegenTime = GetTickCount();
			gObj[iMonsterIndex].m_Attribute = iKalimaGateLevel + 51;
			gObj[iMonsterIndex].DieRegen = FALSE;
			
			LogAddTD("[Kalima] [%s][%s] Create Kalima Gate Successfuly (Live:%d, GateTick:%u, DieRegen:%d, Map:%d, X:%d, Y:%d, SummonIndex:%d, OwnerIndex:%d, GateNo.:%d)",
				gObj[iIndex].AccountID, gObj[iIndex].Name, gObj[iMonsterIndex].Live, gObj[iMonsterIndex].RegenTime,
				gObj[iMonsterIndex].DieRegen, gObj[iMonsterIndex].MapNumber, gObj[iMonsterIndex].X,
				gObj[iMonsterIndex].Y, iMonsterIndex, iIndex, iKalimaGateLevel+1);
			bKalimaGateCreateSucceed = TRUE;
		}
	}
	__finally
	{
		LeaveCriticalSection(&this->m_critKalimaGate);
	}

	return true;
}
void CSantaEvent::AddMonsters()
{
	int iMonsterIndex = gObjAddMonster(0);

	if( iMonsterIndex >= 0 )
	{
		LPOBJ lpObj = &gObj[iMonsterIndex];
		gObjSetMonster(iMonsterIndex, 476);

		while ( gMSetBase.GetBoxPosition(0, g_SantaMapPosition[0][0], g_SantaMapPosition[0][1], g_SantaMapPosition[0][2], g_SantaMapPosition[0][3], lpObj->X, lpObj->Y) == 0 )
		{

		}

		gSantaEvent.BossMapX = lpObj->X;
		gSantaEvent.BossMapY = lpObj->Y; 
			
		lpObj->X = gSantaEvent.BossMapX;
		lpObj->TX = gSantaEvent.BossMapX;
		lpObj->MTX = gSantaEvent.BossMapX;
		lpObj->m_OldX = gSantaEvent.BossMapX;
		lpObj->StartX = gSantaEvent.BossMapX;
		lpObj->Y = gSantaEvent.BossMapY;
		lpObj->TY = gSantaEvent.BossMapY;
		lpObj->MTY = gSantaEvent.BossMapY;
		lpObj->m_OldY = gSantaEvent.BossMapY;
		lpObj->StartY = gSantaEvent.BossMapY;
		lpObj->MapNumber = 0;
		lpObj->Dir = rand()%8;			
		lpObj->Level = 87;
		lpObj->RegenTime = 0;
		lpObj->DieRegen = 0;
		lpObj->m_MoveRange = 1;

		gSantaEvent.MonsterIndex[gSantaEvent.MonsterCount] = iMonsterIndex;
		gSantaEvent.MonsterCount++;

		CLog.LogAdd("Make Evil Santa Claus Map %d Coords (%d,%d)",0,gSantaEvent.BossMapX,gSantaEvent.BossMapY);
	}

	for (int n=0;n<15;n++)
	{
		int iMonsterIndex = gObjAddMonster(0);

		if( iMonsterIndex >= 0 )
		{
			LPOBJ lpObj = &gObj[iMonsterIndex];

			gObjSetMonster(iMonsterIndex, 466);

			gMSetBase.GetBoxPosition(0, gSantaEvent.BossMapX-4, gSantaEvent.BossMapY-4,gSantaEvent.BossMapX+4, gSantaEvent.BossMapY+4, lpObj->X, lpObj->Y);

			lpObj->TX = lpObj->X;
			lpObj->MTX = lpObj->X;
			lpObj->m_OldX = lpObj->X;
			lpObj->StartX = lpObj->X;
			lpObj->Y = lpObj->Y;
			lpObj->TY = lpObj->Y;
			lpObj->MTY = lpObj->Y;
			lpObj->m_OldY = lpObj->Y;
			lpObj->StartY = lpObj->Y;
			lpObj->MapNumber = 0;
			lpObj->Dir = rand()%8;			
			lpObj->Level = 87;
			lpObj->RegenTime = 0;
			lpObj->DieRegen = 0;
			lpObj->m_MoveRange = 1;

			gSantaEvent.MonsterIndex[gSantaEvent.MonsterCount] = iMonsterIndex;
			gSantaEvent.MonsterCount++;

			CLog.LogAdd("Make Cursed Goblin Map %d Coords (%d,%d)",lpObj->MapNumber,lpObj->X,lpObj->Y);
		}
	}
}
BOOL CKalimaGate::CreateKalimaGate2(int iIndex, int iMonMapNumber, BYTE cTX, BYTE cTY)
{	
	BOOL bKalimaGateCreateSucceed = FALSE;
	int iMonsterIndex = -1;

	EnterCriticalSection(&this->m_critKalimaGate);

	__try
	{
		if ( !gObjIsConnected(iIndex))
			return FALSE;

		CLog.LogAdd("[Kalima] [%s][%s] Try to Create Kalima Gate (NextMap)",
			gObj[iIndex].AccountID, gObj[iIndex].Name);

		if ( iMonMapNumber < MAP_INDEX_KALIMA1 || iMonMapNumber > MAP_INDEX_KALIMA6-1 )
		{
			CLog.LogAdd("[Kalima] [%s][%s] Failed to Summon Kalima Gate (NextMap) - MapNumber Error : %d",
				gObj[iIndex].AccountID, gObj[iIndex].Name, iMonMapNumber);

			return FALSE;
		}

		if ( gObj[iIndex].m_cKalimaGateExist == TRUE )
		{
			GCServerMsgStringSend(lMsg.Get(MSGGET(4, 224)), iIndex, 1);

			CLog.LogAdd("[Kalima] [%s][%s] Failed to Summon Kalima Gate (NextMap) - Already Have Gate (SummonIndex:%d)",
				gObj[iIndex].AccountID, gObj[iIndex].Name, gObj[iIndex].m_iKalimaGateIndex);
	
			return FALSE;
		}

		int iMonsterType = iMonMapNumber + 129;
		BYTE cX = cTX;
		BYTE cY = cTY;
		BYTE btMapAttr = MapC[iMonMapNumber].GetAttr(cX, cY);

		if ( btMapAttr != 0 )
		{
			if ( this->GetRandomLocation(iMonMapNumber, cX, cY) == FALSE )
			{
				CLog.LogAdd("[Kalima] [%s][%s] Failed to Summon Kalima Gate (NextMap) - Failed to get Location (MapNumber:%d, X:%d, Y:%d)",
					gObj[iIndex].AccountID, gObj[iIndex].Name, iMonMapNumber, cX, cY);

				return FALSE;
			}
		}

		iMonsterIndex = gObjAddMonster(iMonMapNumber);

		if ( iMonsterIndex >= 0 )
		{
			MONSTER_ATTRIBUTE * lpMATTR = gMAttr.GetAttr(iMonsterType);

			if ( !lpMATTR )
			{
				gObjDel(iMonsterIndex);

				CLog.LogAdd("[Kalima] [%s][%s] Kalima Gate Vanished (NextMap) - lpMATTR == NULL (SummonIndex:%d)",
					gObj[iIndex].AccountID, gObj[iIndex].Name, iMonsterIndex);

				return FALSE;
			}

			gObjSetMonster(iMonsterIndex, iMonsterType);
			gObj[iMonsterIndex].Live = TRUE;
			gObj[iMonsterIndex].Life = 1000.0;
			gObj[iMonsterIndex].MaxLife = 1000.0;
			gObj[iMonsterIndex].m_PosNum = -1;
			gObj[iMonsterIndex].X = cX;
			gObj[iMonsterIndex].Y = cY;
			gObj[iMonsterIndex].MTX = cX;
			gObj[iMonsterIndex].MTY = cY;
			gObj[iMonsterIndex].TX = cX;
			gObj[iMonsterIndex].TY = cY;
			gObj[iMonsterIndex].m_OldX = cX;
			gObj[iMonsterIndex].m_OldY = cY;
			gObj[iMonsterIndex].StartX = cX;
			gObj[iMonsterIndex].StartY = cY;
			gObj[iMonsterIndex].MapNumber = iMonMapNumber;
			gObj[iMonsterIndex].m_MoveRange = 0;
			gObj[iMonsterIndex].m_cKalimaGateEnterCount = 0;

			gObj[iIndex].m_cKalimaGateExist = TRUE;
			gObj[iIndex].m_iKalimaGateIndex = iMonsterIndex;

			gObj[iMonsterIndex].Level = lpMATTR->m_Level;
			gObj[iMonsterIndex].Type = OBJ_MONSTER;
			gObj[iMonsterIndex].MaxRegenTime = 1000;
			gObj[iMonsterIndex].Dir = 1;

			gObj[iMonsterIndex].m_RecallMon = iIndex;
			gObj[iMonsterIndex].RegenTime = GetTickCount();
			gObj[iMonsterIndex].m_Attribute = 58;
			gObj[iMonsterIndex].DieRegen = FALSE;
			
			CLog.LogAdd("[Kalima] [%s][%s] Create Kalima Gate Successfuly (NextMap) (Live:%d, GateTick:%u, DieRegen:%d, Map:%d, X:%d, Y:%d, SummonIndex:%d, OwnerIndex:%d)",
				gObj[iIndex].AccountID, gObj[iIndex].Name, gObj[iMonsterIndex].Live, gObj[iMonsterIndex].RegenTime,
				gObj[iMonsterIndex].DieRegen, gObj[iMonsterIndex].MapNumber, gObj[iMonsterIndex].X,
				gObj[iMonsterIndex].Y, iMonsterIndex, iIndex);
			bKalimaGateCreateSucceed = TRUE;


		}
	}
	__finally
	{
		LeaveCriticalSection(&this->m_critKalimaGate);
	}

	return TRUE;
}
Exemple #5
0
//----- (00563760) --------------------------------------------------------
BOOL CMercenary::CreateMercenary(int iIndex, int iMercenaryTypeIndex, BYTE cTX, BYTE cTY)
{
#if (GS_CASTLE==1)
	LPOBJ lpObj = &gObj[iIndex];
	int iMonsterIndex=-1;

	BYTE btMapAttr = MapC[lpObj->MapNumber].GetAttr(cTX, cTY);
	if ( lpObj->MapNumber != MAP_INDEX_CASTLESIEGE )
	{
		GCServerMsgStringSend(lMsg.Get(MSGGET(6, 91)), lpObj->m_Index, 1);
		return FALSE;
	}

	if ( g_CastleSiege.GetCastleState() != 7 )
	{
		GCServerMsgStringSend(lMsg.Get(MSGGET(6, 94)), lpObj->m_Index, 1);
		return FALSE;
	}

	if ( iMercenaryTypeIndex != 286 && iMercenaryTypeIndex != 287 )
		goto SKIP_CHK;

	if ( lpObj->m_btCsJoinSide != 1 )
	{
		GCServerMsgStringSend(lMsg.Get(MSGGET(6, 92)), lpObj->m_Index, 1);
		return FALSE;
	}
	
	if ( lpObj->GuildStatus != GUILD_MASTER && lpObj->GuildStatus != GUILD_ASSISTANT )
	{
		GCServerMsgStringSend(lMsg.Get(MSGGET(6, 93)), lpObj->m_Index, 1);
		return FALSE;
	}

SKIP_CHK:
	if ( this->m_iMercenaryCount > 100 )
	{
		GCServerMsgStringSend(lMsg.Get(MSGGET(6, 95)), lpObj->m_Index, 1);
		return FALSE;
	}

	iMonsterIndex = gObjAddMonster(lpObj->MapNumber);
	if ( iMonsterIndex < 0 )
	{
		GCServerMsgStringSend(lMsg.Get(MSGGET(6, 97)), lpObj->m_Index, 1);
		return FALSE;
	}

	LPMONSTER_ATTRIBUTE lpMATTR = gMAttr.GetAttr(iMercenaryTypeIndex);
	if ( !lpMATTR )
	{
		gObjDel(iMonsterIndex);
		LogAddTD("[CastleSiege] [%s][%s]  Mercenary Vanished (NextMap) - lpMATTR == NULL (SummonIndex:%d)",
			lpObj->AccountID, lpObj->Name, iMonsterIndex);
		return FALSE;
	}

	gObjSetMonster(iMonsterIndex, iMercenaryTypeIndex,"CMercenary::CreateMercenary");

	gObj[iMonsterIndex].Live = TRUE;
	gObj[iMonsterIndex].Life = lpMATTR->m_Hp;
	gObj[iMonsterIndex].MaxLife = lpMATTR->m_Hp;
	gObj[iMonsterIndex].m_PosNum = -1;
	gObj[iMonsterIndex].X = cTX;
	gObj[iMonsterIndex].Y = cTY;
	gObj[iMonsterIndex].MTX = cTX;
	gObj[iMonsterIndex].MTY = cTY;
	gObj[iMonsterIndex].TX = cTX;
	gObj[iMonsterIndex].TY = cTY;
	gObj[iMonsterIndex].m_OldX = cTX;
	gObj[iMonsterIndex].m_OldY = cTY;
	gObj[iMonsterIndex].StartX = cTX;
	gObj[iMonsterIndex].StartY = cTY;
	gObj[iMonsterIndex].MapNumber = lpObj->MapNumber;
	gObj[iMonsterIndex].m_MoveRange = 0;
	gObj[iMonsterIndex].Level = lpMATTR->m_Level;		//*(_WORD *)(lpMATTR + 28) lpMATTR->m_Hp
	gObj[iMonsterIndex].Type = OBJ_MONSTER;				//2
	gObj[iMonsterIndex].MaxRegenTime = 1000;
	gObj[iMonsterIndex].Dir = 1;
	gObj[iMonsterIndex].RegenTime = GetTickCount();
	gObj[iMonsterIndex].m_Attribute = 0;
	gObj[iMonsterIndex].DieRegen = 0;
	gObj[iMonsterIndex].m_btCsNpcType = 2;
	gObj[iMonsterIndex].m_btCsJoinSide = 1;

	GCServerMsgStringSend(lMsg.Get(MSGGET(6, 96)), lpObj->m_Index, 1);

	this->m_iMercenaryCount += 1;

	if ( lpObj->lpGuild )
		LogAddTD("[CastleSiege] Mercenary is summoned [%d] - [%d][%d] [%s][%s][%d] - (Guild : %s)", gObj[iMonsterIndex].Class,gObj[iMonsterIndex].X,gObj[iMonsterIndex].Y,lpObj->AccountID,lpObj->Name,lpObj->MapNumber,lpObj->lpGuild->Name);
	else
		LogAddTD("[CastleSiege] Mercenary is summoned [%d] - [%d][%d] [%s][%s][%d]", gObj[iMonsterIndex].Class,gObj[iMonsterIndex].X,gObj[iMonsterIndex].Y,lpObj->AccountID,lpObj->Name,lpObj->MapNumber);
#endif
	return TRUE;
}
// ----------------------------------------------------------------------------------------
void CDoubleGoer::SetMonsters()
{
	char Type = gDoubleGoer.GetEventIndex(gDoubleGoer.EventMap);

	if ( Type == -1 )
	{
		CLog.LogAdd("[BUG TRACER][DoubleGoer]: Set Monsters -> Type Error");
		return;
	}

	if ( gDoubleGoer.NormalMonsterCount[Type] <= 0 )
	{
		CLog.LogAdd("[BUG TRACER][DoubleGoer]: Set Monsters -> Monster Count Error");
		return;
	}
	int result = -1;
	int MobCt = gDoubleGoer.NormalMonsterCount[Type];

	for (int i=0;i<gDoubleGoer.NormalMonsterCount[Type];i++)
	{
		if ( gDoubleGoer.NormalMonsterPos[Type][i] != -1 )
		{
			result = gObjAddMonster(gDoubleGoer.EventMap);

			if ( result >= 0 )
			{
				gObj[result].m_PosNum = gDoubleGoer.NormalMonsterPos[Type][i];
				gObj[result].X = gMSetBase.m_Mp[gDoubleGoer.NormalMonsterPos[Type][i]].m_X;
				gObj[result].Y = gMSetBase.m_Mp[gDoubleGoer.NormalMonsterPos[Type][i]].m_Y;
				gObj[result].MapNumber = gDoubleGoer.EventMap;
				gObj[result].TX = gObj[result].X;
				gObj[result].TY = gObj[result].Y;
				gObj[result].m_OldX = gObj[result].X;
				gObj[result].m_OldY = gObj[result].Y;
				gObj[result].StartX = gObj[result].X;
				gObj[result].StartY = gObj[result].Y;
				gObj[result].MTX = gDoubleGoer.EventX;
				gObj[result].MTY = gDoubleGoer.EventY;
				gObjSetMonster(result, gMSetBase.m_Mp[gDoubleGoer.NormalMonsterPos[Type][i]].m_Type);
				gObj[result].Dir = rand()%8;

				gDoubleGoer.MonstersAddIndex[gDoubleGoer.MonstersAddCount] = result;
				gDoubleGoer.MonstersAddCount++;
			}
			else
			{
				CLog.LogAdd("[BUG TRACER][DoubleGoer]: Set Monsters -> Add Monster Error");
			}
		}
	}
	for (int i=0;i<3;i++)
	{
		if ( gDoubleGoer.BossMonsterPos[Type][i] != -1 )
		{
			result = gObjAddMonster(gDoubleGoer.EventMap);

			if ( result >= 0 )
			{
				gObj[result].m_PosNum = gDoubleGoer.BossMonsterPos[Type][i];
				gObj[result].X = gMSetBase.m_Mp[gDoubleGoer.BossMonsterPos[Type][i]].m_X;
				gObj[result].Y = gMSetBase.m_Mp[gDoubleGoer.BossMonsterPos[Type][i]].m_Y;
				gObj[result].MapNumber = gDoubleGoer.EventMap;
				gObj[result].TX = gObj[result].X;
				gObj[result].TY = gObj[result].Y;
				gObj[result].m_OldX = gObj[result].X;
				gObj[result].m_OldY = gObj[result].Y;
				gObj[result].StartX = gObj[result].X;
				gObj[result].StartY = gObj[result].Y;
				gObj[result].MTX = gDoubleGoer.EventX;
				gObj[result].MTY = gDoubleGoer.EventY;
				gObj[result].MaxRegenTime = 0;
				gObjSetMonster(result, gMSetBase.m_Mp[gDoubleGoer.BossMonsterPos[Type][i]].m_Type);
				gObj[result].Dir = rand()%8;

				gDoubleGoer.BossMonsterIndex[i] = result;
			}
			else
			{
				CLog.LogAdd("[DoubleGoer]: Set Monsters -> Add Monster Error");
			}
		}
	}


}
// -----------------------------------------------------------------------------------------------------------------------
void CIllusionTemple::SetTempleMonsters(int iTempleIndex)
{
	if ( IT_FLOOR_RANGE(iTempleIndex) == FALSE )
	{
		return;
	}

	for(int iStatueIndex = 0; iStatueIndex < MAX_IT_STATUES; iStatueIndex++)
	{
		int result = 0;
		result = gObjAddMonster(iTempleIndex + MAP_INDEX_ILLUSION1);
		if ( result >= 0 && result < OBJMAX)
		{
			gObj[result].m_PosNum = -1;
			gObj[result].X = s_itStatuePosition[iStatueIndex].PositionX;
			gObj[result].Y = s_itStatuePosition[iStatueIndex].PositionY;
			gObj[result].MapNumber = MAP_INDEX_ILLUSION1 + iTempleIndex;
			gObj[result].TX = s_itStatuePosition[iStatueIndex].PositionX;
			gObj[result].TY = s_itStatuePosition[iStatueIndex].PositionY;
			gObj[result].m_OldX = s_itStatuePosition[iStatueIndex].PositionX;
			gObj[result].m_OldY = s_itStatuePosition[iStatueIndex].PositionY;
			gObj[result].Dir = s_itStatuePosition[iStatueIndex].Direction;
			gObj[result].StartX = s_itStatuePosition[iStatueIndex].PositionX;
			gObj[result].StartY = s_itStatuePosition[iStatueIndex].PositionY;
			gObjSetMonster(result, 380);
			gObj[result].MaxRegenTime = 200;
			this->m_IllusionTemple[iTempleIndex].m_Statues[iStatueIndex] = result;
		}
		else
		{
			this->SetTempleState(iTempleIndex, IT_STATE_CLOSED);
			CLog.LogAddC(2, "[IllusionTemple] Statue Setup Error! (Statue:%d, Temple:%d)", iStatueIndex, iTempleIndex + 1);
			return;
		}
	}

	this->m_IllusionTemple[iTempleIndex].m_BallOwner = this->m_IllusionTemple[iTempleIndex].m_Statues[rand()%2];

	for ( int n = 0; n < gMSetBase.m_Count; n++)
	{
		if ( IT_MAP_RANGE(gMSetBase.m_Mp[n].m_MapNumber) == TRUE )
		{

			if ( (gMSetBase.m_Mp[n].m_MapNumber - MAP_INDEX_ILLUSION1) != iTempleIndex )
			{
				continue;
			}

			if(gMSetBase.m_Mp[n].m_Type == 380) continue;

			int result = gObjAddMonster(gMSetBase.m_Mp[n].m_MapNumber);
			if ( result >= 0  && result <= OBJMAX)
			{
				gObj[result].m_PosNum = n;
				gObj[result].X = gMSetBase.m_Mp[n].m_X;
				gObj[result].Y = gMSetBase.m_Mp[n].m_Y;
				gObj[result].MapNumber = gMSetBase.m_Mp[n].m_MapNumber;
				gObj[result].TX = gObj[result].X;
				gObj[result].TY = gObj[result].Y;
				gObj[result].m_OldX = gObj[result].X;
				gObj[result].m_OldY = gObj[result].Y;
				gObj[result].Dir = gMSetBase.m_Mp[n].m_Dir;
				gObj[result].StartX = (BYTE)gObj[result].X;
				gObj[result].StartY = (BYTE)gObj[result].Y;
				gObjSetMonster(result, gMSetBase.m_Mp[n].m_Type);
				gObj[result].MaxRegenTime = 2000;
				this->m_IllusionTemple[iTempleIndex].m_SpawnedMonsters.push_back(result);
			}
		}
	}
}
Exemple #8
0
int CLifeStone::CreateLifeStone(int iIndex)
{
	LPOBJ lpObj = &gObj[iIndex];
	int iMonsterIndex = -1;
	BYTE cX = (BYTE)lpObj->X;
	BYTE cY = (BYTE)lpObj->Y;

	if ( g_CastleSiegeSync.GetCastleState() != 7 )
	{
		MsgOutput(iIndex, "You can't summon the Life Stone after the Siege begins.");
		return FALSE;
	}

	if ( lpObj->GuildStatus != 0x80 )
		return FALSE;

	if ( lpObj->m_btCsJoinSide < 2 )
	{
		MsgOutput(iIndex, "Can only be used by the Offensive Alliance.");
		return FALSE;
	}

	if ( lpObj->lpGuild->lpLifeStone  )
	{
		MsgOutput(iIndex, "Life Stone has already been summoned.");
		return FALSE;
	}

	if ( cX > 150 && cX < 210 && cY > 175 && cY < 230 )
	{
		MsgOutput(iIndex, "You can't summon the Life Stone inside the Dragon Tower.");
		return FALSE;
	}

	BYTE btMapAttr = MapC[lpObj->MapNumber].GetAttr(cX, cY);

	if ( gObj[iIndex].MapNumber != MAP_INDEX_CASTLESIEGE )
	{
		MsgOutput(iIndex, "This is not a map of the Offensive Alliance.");
		return FALSE;
	}

	iMonsterIndex = gObjAddMonster(lpObj->MapNumber);

	if ( iMonsterIndex >= 0 )
	{
		MONSTER_ATTRIBUTE * MAttr = gMAttr.GetAttr(278);

		if ( MAttr == NULL )
		{
			gObjDel(iMonsterIndex);
			return FALSE;
		}

		gObjSetMonster(iMonsterIndex, 278);

		gObj[iMonsterIndex].Live = TRUE;
		gObj[iMonsterIndex].Life = MAttr->m_Hp;
		gObj[iMonsterIndex].MaxLife = MAttr->m_Hp;
		gObj[iMonsterIndex].m_PosNum = -1;
		gObj[iMonsterIndex].X = cX;
		gObj[iMonsterIndex].Y = cY;
		gObj[iMonsterIndex].MTX = cX;
		gObj[iMonsterIndex].MTY = cY;
		gObj[iMonsterIndex].TX = cX;
		gObj[iMonsterIndex].TY = cY;
		gObj[iMonsterIndex].m_OldX = cX;
		gObj[iMonsterIndex].m_OldY = cY;
		gObj[iMonsterIndex].StartX = cX;
		gObj[iMonsterIndex].StartY = cY;
		gObj[iMonsterIndex].MapNumber = lpObj->MapNumber;
		gObj[iMonsterIndex].m_MoveRange = 0;
		gObj[iMonsterIndex].Level = MAttr->m_Level;
		gObj[iMonsterIndex].Type = OBJ_MONSTER;
		gObj[iMonsterIndex].MaxRegenTime = 1000;
		gObj[iMonsterIndex].Dir = 1;
		gObj[iMonsterIndex].RegenTime = GetTickCount();
		gObj[iMonsterIndex].m_Attribute = 0;
		gObj[iMonsterIndex].DieRegen = 0;
		gObj[iMonsterIndex].m_btCsNpcType = OBJ_NPC;
		gObj[iMonsterIndex].m_btCsJoinSide = lpObj->m_btCsJoinSide;
		gObj[iMonsterIndex].lpGuild = lpObj->lpGuild;
		gObj[iMonsterIndex].m_btCreationState = 0;
		lpObj->lpGuild->lpLifeStone = &gObj[iMonsterIndex];

		MsgOutput(iIndex, "Life Stone summon succeeded!");

		LogAdd("[CastleSiege] LifeStone is created - [%s] [%s][%s] (Map:%d)(X:%d, Y:%d)",
			lpObj->lpGuild->Name, lpObj->AccountID, lpObj->Name, lpObj->MapNumber, cX, cY);

		lpObj->m_btLifeStoneCount++;

	}
	else
	{
		MsgOutput(iIndex, "Life Stone summon failed!");
		return FALSE;
	}

	return TRUE;
}
int CKanturuMonsterMng::SetKanturuMonster(int iGroupNumber)
{
	int iMapNumber = 0;
	WORD wType = 0;
	LPOBJ lpObj;
	int iResult;
	int iRegenCount = 0;
	
	for ( int iCount=0;iCount<MAX_KANTURU_MONSTER;iCount++)
	{
		if ( this->m_SetBaseInfo[iCount].btGroup == iGroupNumber &&
			 this->m_SetBaseInfo[iCount].wType != 0 )
		{
			iResult  = gObjAddMonster(this->m_SetBaseInfo[iCount].btMapNumber);

			if ( iResult < 0 )
			{
				LogAddTD("[ KANTURU ][ SetBossMapMonster ] Fail - Type:%d Map[%d]-[%d][%d]",
					this->m_SetBaseInfo[iCount].wType,
					this->m_SetBaseInfo[iCount].btMapNumber,
					this->m_SetBaseInfo[iCount].btX,
					this->m_SetBaseInfo[iCount].btY);
			}
			else
			{
				lpObj = &gObj[iResult];

				lpObj->m_PosNum = -1;
				lpObj->X = this->m_SetBaseInfo[iCount].btX;
				lpObj->Y = this->m_SetBaseInfo[iCount].btY;
				lpObj->MapNumber = this->m_SetBaseInfo[iCount].btMapNumber;

				if ( this->GetPosition(iCount, lpObj->MapNumber, lpObj->X, lpObj->Y) == FALSE )
				{
					gObjDel(iResult);
					continue;
				}

				lpObj->TX = lpObj->X;
				lpObj->TY = lpObj->Y;
				lpObj->m_OldX = lpObj->X;
				lpObj->m_OldY = lpObj->Y;
				lpObj->StartX = lpObj->X;
				lpObj->StartY = lpObj->Y;
				lpObj->m_MoveRange = this->m_SetBaseInfo[iCount].btDistance;
				lpObj->DieRegen = FALSE;

				if ( this->m_SetBaseInfo[iCount].btDir == 0xFF )
				{
					lpObj->Dir = rand()%8;
				}
				else
				{
					lpObj->Dir = this->m_SetBaseInfo[iCount].btDir;
				}

				if ( gObjSetMonster(iResult, this->m_SetBaseInfo[iCount].wType) == FALSE )
				{
					gObjDel(iResult);
					continue;
				}

				if ( this->m_SetBaseInfo[iCount].wType == 364 )	/// Maya Hand
				{
					this->m_iMayaObjIndex = iResult;

					LogAddTD("[ KANTURU ][ SetBossMapMonster ] %s(Index:%d / ObjIndex:%d) Map:%d-[%d][%d]",
						gObj[iResult].Name, gObj[iResult].Class, iResult, gObj[iResult].MapNumber,
						gObj[iResult].X, gObj[iResult].Y);

					continue;
				}

				if ( gObj[iResult].Type == OBJ_MONSTER )
				{
					this->m_KanturuMonster.AddObj(iResult);
					this->m_iMaxRegenMonsterCount++;
					this->m_iAliveMonsterCount++;

					LogAddTD("[ KANTURU ][ SetBossMapMonster ] Count:%d %s(Index:%d / ObjIndex:%d) Map:%d-[%d][%d]",
						this->m_iAliveMonsterCount, gObj[iResult].Name, gObj[iResult].Class, iResult,
						gObj[iResult].MapNumber,gObj[iResult].X, gObj[iResult].Y);
				}

				iRegenCount++;
			}
		}
	}

	return iRegenCount;
}
BOOL MonsterHerd::AddMonster(int iMonsterType, BOOL bRegen, BOOL bAttackFirst)
{
	if ( this->m_bHasInfo == 0 )
	{
		return false;
	}

	int iIndex;
	BYTE btMapNumber = this->m_iMapNumber;
	BYTE cX=0;
	BYTE cY=0;

	if (this->GetRandomLocation(cX, cY) == FALSE )
	{
		return false;
	}

	iIndex = gObjAddMonster(this->m_iMapNumber);

	if ( iIndex >= 0 )
	{
		gObj[iIndex].m_PosNum = -1;
		gObj[iIndex].X = cX;
		gObj[iIndex].Y = cY;
		gObj[iIndex].MapNumber = this->m_iMapNumber;
		gObj[iIndex].TX = gObj[iIndex].X;
		gObj[iIndex].TY = gObj[iIndex].Y;
		gObj[iIndex].m_OldX = gObj[iIndex].X;
		gObj[iIndex].m_OldY = gObj[iIndex].Y;
		gObj[iIndex].StartX = gObj[iIndex].X;
		gObj[iIndex].StartY = gObj[iIndex].Y;

		LPMONSTER_ATTRIBUTE iAttr = gMAttr.GetAttr(iMonsterType);

		if ( iAttr == NULL )
		{
			gObjDel(iIndex);
			return false;
		}

		gObj[iIndex].Level = iAttr->m_Level;
		gObjSetMonster(iIndex, iMonsterType);
		gObj[iIndex].MaxRegenTime = 1000;
		gObj[iIndex].Dir = rand() % 8;
		gObj[iIndex].m_bIsInMonsterHerd = 1;
		gObj[iIndex].m_bIsMonsterAttackFirst = bAttackFirst;
		gObj[iIndex].m_lpMonsterHerd = this;

		EnterCriticalSection(&this->m_critMonsterHerd);

		_MONSTER_HERD_DATA pMonsterData;
		pMonsterData.m_iIndex = iIndex;
		pMonsterData.m_iType = iMonsterType;
		pMonsterData.m_iX = cX;
		pMonsterData.m_iX = cY;	// #error Apply Deathway Fix, change btXMap for btYMap
		pMonsterData.m_bRegen = bRegen;

		this->m_mapMonsterHerd.insert( std::pair<int, _MONSTER_HERD_DATA>(iIndex, pMonsterData) );

		LeaveCriticalSection(&this->m_critMonsterHerd);
	}
	else
	{
		return FALSE;
	}

	return TRUE;

}
BOOL CRaklionSelupan::CreateSelupan()
{
	int m_Type = -1;

	for ( int n=0;n<gMSetBase.m_Count;n++)
	{
		if( gMSetBase.m_Mp[n].m_Type == 459 )
		{
			m_Type = n;
		}
	}

	LPOBJ lpObj = NULL;
	int result = 0;


	result = gObjAddMonster(MAP_INDEX_RAKLIONBOSS);

	if ( result < 0 )
	{
		LogAddTD("[RAKLION] CreateSelupan error");
		return FALSE;
	}
	
	lpObj = &gObj[result];
	
	gObjSetPosMonster(result, m_Type);
	
	gObjSetMonster(result, 459); 
	
	LogAddTD("[RAKLION] Create Selupan : X (%d) / Y(%d)",lpObj->X,lpObj->Y);

	LPOBJ lpTargetObj = NULL;

	for (int n=0;n<OBJMAX;n++)
	{
		lpTargetObj = &gObj[n];

		if(lpTargetObj->MapNumber == MAP_INDEX_RAKLIONBOSS)
		{
			gObjStateSetCreate(n);
		}
	}

	for (int n=0;n<OBJMAX;n++)
	{
		lpTargetObj = &gObj[n];

		if(lpTargetObj->MapNumber == MAP_INDEX_RAKLIONBOSS)
		{
			gObjViewportListDestroy(n);
		}
	}
	
	for (int n=0;n<OBJMAX;n++)
	{
		lpTargetObj = &gObj[n];

		if(lpTargetObj->MapNumber == MAP_INDEX_RAKLIONBOSS)
		{
			gObjViewportListCreate(n);
		}
	}
	
	for (int n=0;n<OBJMAX;n++)
	{
		lpTargetObj = &gObj[n];

		if(lpTargetObj->MapNumber == MAP_INDEX_RAKLIONBOSS)
		{
			gObjViewportListProtocol(n);
		}
	}

	gObjSetState();

	this->m_iBossAttackMin = lpObj->m_AttackDamageMin;
	this->m_iBossAttackMax = lpObj->m_AttackDamageMax;

	return TRUE;
}
Exemple #12
0
//----- (00562770) --------------------------------------------------------
BOOL CLifeStone::CreateLifeStone(int iIndex)
{
	LPOBJ lpObj = &gObj[iIndex];
	int iMonsterIndex=-1;

	if ( g_CastleSiege.GetCastleState() != 7 )
	{
		//(98175472, 1248)	(4, 224)
		//(98175472, 1180)	(4, 156)	=> BASE: 1024
		//(98175472, 1500)	(5, 220)	=> 1500-1024 = 476 (220 = 476 - 256)
		GCServerMsgStringSend(lMsg.Get(MSGGET(6, 109)), lpObj->m_Index, 1);
		return FALSE;
	}

	if (lpObj->GuildStatus != GUILD_MASTER)
	{
		return FALSE;
	}

	if (lpObj->m_btCsJoinSide < 2 )
	{
		GCServerMsgStringSend(lMsg.Get(MSGGET(6, 105)), lpObj->m_Index, 1);
		return FALSE;
	}

	if (lpObj->lpGuild == NULL)
		return FALSE;

	if (!lpObj->lpGuild->back)
		return FALSE;

	if (lpObj->lpGuild->back->Number > 0)
	{
		GCServerMsgStringSend(lMsg.Get(MSGGET(6, 106)), lpObj->m_Index, 1);
		return FALSE;
	}

	if ( (lpObj->X > 150 && lpObj->X < 210) && (lpObj->Y > 175 && lpObj->Y < 230) )
	{
		GCServerMsgStringSend(lMsg.Get(MSGGET(6, 108)), lpObj->m_Index, 1);
		return FALSE;
	}

	BYTE btMapAttr = MapC[lpObj->MapNumber].GetAttr(lpObj->X, lpObj->Y);
	if ( lpObj->MapNumber != MAP_INDEX_CASTLESIEGE )
	{
		GCServerMsgStringSend(lMsg.Get(MSGGET(6, 91)), lpObj->m_Index, 1);
		return FALSE;
	}

	iMonsterIndex = gObjAddMonster(lpObj->MapNumber);
	if ( iMonsterIndex < 0 )
	{
		GCServerMsgStringSend(lMsg.Get(MSGGET(6, 111)), lpObj->m_Index, 1);
		return FALSE;
	}

	LPMONSTER_ATTRIBUTE lpMATTR = gMAttr.GetAttr(278);
	if ( !lpMATTR )
	{
		gObjDel(iMonsterIndex);
		LogAddTD("[CastleSiege] [%s][%s] LifeStone Vanished (NextMap) - lpMATTR == NULL (SummonIndex:%d)",
			lpObj->AccountID, lpObj->Name, iMonsterIndex);
		return FALSE;
	}
	
	gObjSetMonster(iMonsterIndex, 278,"CLifeStone::CreateLifeStone");

	gObj[iMonsterIndex].Live = TRUE;
	gObj[iMonsterIndex].Life = lpMATTR->m_Hp;
	gObj[iMonsterIndex].MaxLife = lpMATTR->m_Hp;
	gObj[iMonsterIndex].m_PosNum = -1;
	gObj[iMonsterIndex].X = lpObj->X;
	gObj[iMonsterIndex].Y = lpObj->Y;
	gObj[iMonsterIndex].MTX = lpObj->X;
	gObj[iMonsterIndex].MTY = lpObj->Y;
	gObj[iMonsterIndex].TX = lpObj->X;
	gObj[iMonsterIndex].TY = lpObj->Y;
	gObj[iMonsterIndex].m_OldX = lpObj->X;
	gObj[iMonsterIndex].m_OldY = lpObj->Y;
	gObj[iMonsterIndex].StartX = lpObj->X;
	gObj[iMonsterIndex].StartY = lpObj->Y;
	gObj[iMonsterIndex].MapNumber = lpObj->MapNumber;
	gObj[iMonsterIndex].m_MoveRange = 0;
	gObj[iMonsterIndex].Level = lpMATTR->m_Level;	//*(_WORD *)(lpMATTR + 28)
	gObj[iMonsterIndex].Type = OBJ_MONSTER;		//2
	gObj[iMonsterIndex].MaxRegenTime = 1000;
	gObj[iMonsterIndex].Dir = 1;
	gObj[iMonsterIndex].RegenTime = GetTickCount();
	gObj[iMonsterIndex].m_Attribute = 0;
	gObj[iMonsterIndex].DieRegen = 0;
	gObj[iMonsterIndex].m_btCsNpcType = 3;
	gObj[iMonsterIndex].m_btCsJoinSide = lpObj->m_btCsJoinSide;
	gObj[iMonsterIndex].lpGuild = lpObj->lpGuild;
	gObj[iMonsterIndex].m_btCreationState = 0;
	lpObj->lpGuild->back->Number = gObj[iMonsterIndex].m_Index;

	GCServerMsgStringSend(lMsg.Get(MSGGET(6, 105)), lpObj->m_Index, 1);
	LogAddTD("[CastleSiege] LifeStone is created - [%s][%s] (Map:%d)(X:%d, Y:%d)",
		lpObj->AccountID,lpObj->Name,lpObj->MapNumber,lpObj->X,lpObj->Y);

	lpObj->m_btLifeStoneCount += 1;
	return TRUE;
}
void TMonsterAIGroup::Init(int iGroupNumber)
{
	if ( TMonsterAIGroup::s_iMonsterAIGroupMemberCount[iGroupNumber] == 0 )
		return;

	TMonsterAIGroup::DelGroupInstance(iGroupNumber);

	for ( int j=0;j<MAX_MONSTER_AI_GROUP_MEMBER;j++)
	{
		TMonsterAIGroupMember & Memb = TMonsterAIGroup::s_MonsterAIGroupMemberArray[iGroupNumber][j];

		if ( Memb.m_iGuid == -1 )
			continue;

		int iResult = gObjAddMonster(Memb.m_iMapNumber);

		if ( iResult >= 0 )
		{
			gObj[iResult].m_PosNum = -1;
			gObj[iResult].MapNumber = Memb.m_iMapNumber;
			gObj[iResult].Live = TRUE;

			gObjViewportListProtocolDestroy(&gObj[iResult]);
			gObjViewportClose(&gObj[iResult]);

			BYTE cX;
			BYTE cY;

			if ( Memb.m_iCreateType == 1 )
			{
				int iRadius = 10;
				BOOL bGetPosition = FALSE;
				int iCount = 100;

				while ( iCount-- != 0 )
				{
					cX = Random(0,iRadius) * ((Random(0,1)==0)?-1:1) + Memb.m_iStartX;
					cY = Random(0,iRadius) * ((Random(0,1)==0)?-1:1) + Memb.m_iStartY;

					BYTE btMapAttr = MapC[Memb.m_iMapNumber].GetAttr(cX, cY);

					if ( btMapAttr == 0 )
					{
						bGetPosition = TRUE;
						break;
					}
				}

				if ( bGetPosition == FALSE )
				{
					gObj[iResult].Live = FALSE;
					gObj[iResult].m_State = 4;
					gObj[iResult].RegenTime = GetTickCount();
					gObj[iResult].DieRegen = 1;

					return;
				}
			}
			else if ( Memb.m_iCreateType == 0 )
			{
				cX = Memb.m_iStartX;
				cY = Memb.m_iStartY;
			}

			gObj[iResult].X = cX;
			gObj[iResult].Y = cY;
			gObj[iResult].MTX = gObj[iResult].X;
			gObj[iResult].MTY = gObj[iResult].Y;
			gObj[iResult].TX = gObj[iResult].X;
			gObj[iResult].TY = gObj[iResult].Y;
			gObj[iResult].StartX = (BYTE)gObj[iResult].X;
			gObj[iResult].StartY = (BYTE)gObj[iResult].Y;


			gObjSetMonster(iResult, Memb.m_iClass);

			gObj[iResult].m_iGroupNumber = Memb.m_iGroupNumber;
			gObj[iResult].m_iGroupMemberGuid = Memb.m_iGuid;
			gObj[iResult].m_iCurrentAI = Memb.m_iStartAI;
			gObj[iResult].m_iBasicAI = Memb.m_iStartAI;
			gObj[iResult].m_iRegenType = Memb.m_iRegenType;
			gObj[iResult].Dir = Memb.m_iStartDir;
			gObj[iResult].m_State = 1;
			gObj[iResult].DieRegen = 0;
			Memb.m_iObjIndex = iResult;

			if ( Memb.m_iCreateType == -1 )
			{
				gObj[iResult].Live = FALSE;
				gObj[iResult].m_State = 4;
				gObj[iResult].RegenTime = GetTickCount();
				gObj[iResult].DieRegen = 1;

				continue;
			}
			
			LogAdd("[ KANTURU ][ SetAIMonster ] %s(Index:%d ObjIndex:%d) Map:%d-[%d][%d]",
				gObj[iResult].Name, gObj[iResult].Class, iResult, gObj[iResult].MapNumber,
				gObj[iResult].X, gObj[iResult].Y);
		}
	}
}
void XMasEvent::XMasEventInvade()
{
	int iMapNumber = 0;
	WORD wType = 0;
	LPOBJ lpObj;
	int iResult;
	int iRegenCount = 0;

	for (int iCount=0;iCount<this->m_iMaxMonsterCount;iCount++)
	{
		if ( this->m_SetBaseInfo[iCount].wType != 0)
		{
			iResult = gObjAddMonster(this->m_SetBaseInfo[iCount].btMapNumber);

			if ( iResult < 0 )
				{
					LogAddTD("[ SANTA EVENT ][ Set Invasion Monster ] Fail - Type:%d Map[%d]-[%d][%d]",
						this->m_SetBaseInfo[iCount].wType,
						this->m_SetBaseInfo[iCount].btMapNumber,
						this->m_SetBaseInfo[iCount].btX,
						this->m_SetBaseInfo[iCount].btY);
				}
			else
				{
					lpObj = &gObj[iResult];

					lpObj->m_PosNum = -1;
					lpObj->X = this->m_SetBaseInfo[iCount].btX;
					lpObj->Y = this->m_SetBaseInfo[iCount].btY;
					lpObj->MapNumber = this->m_SetBaseInfo[iCount].btMapNumber;

/*				if ( this->GetPosition(iCount, lpObj->MapNumber, lpObj->X, lpObj->Y) == FALSE )
				{
					gObjDel(iResult);
					continue;
				}*/

					lpObj->TX = lpObj->X;
					lpObj->TY = lpObj->Y;
					lpObj->m_OldX = lpObj->X;
					lpObj->m_OldY = lpObj->Y;
					lpObj->StartX = lpObj->X;
					lpObj->StartY = lpObj->Y;
					lpObj->m_MoveRange = this->m_SetBaseInfo[iCount].btDistance;
					lpObj->DieRegen = FALSE;

				if ( this->m_SetBaseInfo[iCount].btDir == 0xFF )
				{
						lpObj->Dir = rand()%8;
				}
				else
				{
						lpObj->Dir = this->m_SetBaseInfo[iCount].btDir;
				}

				if ( gObjSetMonster(iResult, this->m_SetBaseInfo[iCount].wType) == FALSE )
				{
						gObjDel(iResult);
						continue;
				}

				if ( gObj[iResult].Type == OBJ_MONSTER )
				{
					this->m_XMasMonster.AddObj(iResult);
					this->m_iAliveMonsterCount++;

					LogAddTD("[ SANTA EVENT ][ SetInvadeMonster ][ACTIVE]");
				}

				iRegenCount++;
			}
		}
	}
	LogAddTD("[XMAS EVENT] START !!!");
	AllSendServerMsg("[XMAS EVENT] Start in Devias HAPPY HUNTING");
	return;
}
int CLifeStone::CreateLifeStone(int iIndex)
{
	LPOBJ lpObj = &gObj[iIndex];
	int iMonsterIndex = -1;
	unsigned char cX = lpObj->X;
	unsigned char cY = lpObj->Y;

	if(g_CastleSiege.GetCastleState() != CASTLESIEGE_STATE_STARTSIEGE)
	{
		MsgOutput(iIndex,lMsg.Get(MSGGET(6,109)));
		return false;
	}

	if(lpObj->GuildStatus != G_MASTER)
		return false;

	if(lpObj->m_btCsJoinSide < 2)
	{
		MsgOutput(iIndex,lMsg.Get(MSGGET(6,105)));
		return false;
	}

	if(lpObj->lpGuild->lpLifeStone != NULL)
	{
		MsgOutput(iIndex,lMsg.Get(MSGGET(6,106)));
		return false;
	}

	if(cX > 150 && cX < 210 && cY > 175 && cY < 230)
	{
		MsgOutput(iIndex,lMsg.Get(MSGGET(6,108)));
		return false;
	}

	unsigned char btMapAttr = MapC[lpObj->MapNumber].GetAttr(cX,cY);

	if(gObj[iIndex].MapNumber != MAP_INDEX_CASTLESIEGE)
	{
		MsgOutput(iIndex,lMsg.Get(MSGGET(6,91)));
		return false;
	}

	iMonsterIndex = gObjAddMonster(lpObj->MapNumber);

	if(iMonsterIndex >= 0)
	{
		MONSTER_ATTRIBUTE * lpMATTR = gMAttr.GetAttr(278);

		if(lpMATTR == NULL)
		{
			gObjDel(iMonsterIndex);
			return false;
		}

		gObjSetMonster(iMonsterIndex,278);
		gObj[iMonsterIndex].Live = TRUE;
		gObj[iMonsterIndex].Life = (float)lpMATTR->m_Hp;
		gObj[iMonsterIndex].MaxLife = (float)lpMATTR->m_Hp;
		gObj[iMonsterIndex].m_PosNum = -1;
		gObj[iMonsterIndex].X = cX;
		gObj[iMonsterIndex].Y = cY;
		gObj[iMonsterIndex].MTX = cX;
		gObj[iMonsterIndex].MTY = cY;
		gObj[iMonsterIndex].TX = cX;
		gObj[iMonsterIndex].TY = cY;
		gObj[iMonsterIndex].m_OldX = cX;
		gObj[iMonsterIndex].m_OldY = cY;
		gObj[iMonsterIndex].StartX = cX;
		gObj[iMonsterIndex].StartY = cY;
		gObj[iMonsterIndex].MapNumber = lpObj->MapNumber;
		gObj[iMonsterIndex].m_MoveRange = 0;
		gObj[iMonsterIndex].Level = lpMATTR->m_Level;
		gObj[iMonsterIndex].Type = OBJ_MONSTER;
		gObj[iMonsterIndex].MaxRegenTime = 1000;
		gObj[iMonsterIndex].Dir = 1;
		gObj[iMonsterIndex].RegenTime = GetTickCount();
		gObj[iMonsterIndex].m_Attribute = 0;
		gObj[iMonsterIndex].DieRegen = FALSE;
		gObj[iMonsterIndex].m_btCsNpcType = 3;
		gObj[iMonsterIndex].m_btCsJoinSide = lpObj->m_btCsJoinSide;
		gObj[iMonsterIndex].lpGuild = lpObj->lpGuild;
		gObj[iMonsterIndex].m_btCreationState = 0;

		lpObj->lpGuild->lpLifeStone = &gObj[iMonsterIndex];

		MsgOutput(iIndex,lMsg.Get(MSGGET(6,110)));

		LogAddTD("[CastleSiege] LifeStone is created - [%s] [%s][%s] (Map:%d)(X:%d, Y:%d)",
			lpObj->lpGuild->Name,lpObj->AccountID,lpObj->Name,lpObj->MapNumber,cX,cY);

		lpObj->m_btLifeStoneCount++;

	}
	else
	{
		MsgOutput(iIndex,lMsg.Get(MSGGET(6,111)));
		return false;
	}

	return true;
}