void ObjBotWarper::MakeBot() { if(this->Enabled == true) { for(int botNum=0;botNum<MAX_BOTWARPER;botNum++) { if(this->bot[botNum].Enabled == true) { int result = gObjAddCallMon(); if(result >= 0) { this->bot[botNum].index = result; gObj[result].m_PosNum = (WORD)-1; gObj[result].X = this->bot[botNum].X; gObj[result].Y = this->bot[botNum].Y; gObj[result].m_OldX = this->bot[botNum].X; gObj[result].m_OldY = this->bot[botNum].Y; gObj[result].TX = this->bot[botNum].X; gObj[result].TY = this->bot[botNum].Y; gObj[result].MTX = this->bot[botNum].X; gObj[result].MTY = this->bot[botNum].Y; gObj[result].Dir = this->bot[botNum].Dir; gObj[result].MapNumber = this->bot[botNum].Map; gObj[result].Live = TRUE; gObj[result].PathCount = 0; gObj[result].IsBot = 10; gObjSetMonster(result,this->bot[botNum].Class,"PetBot"); gObj[result].ChangeUP = this->bot[botNum].Class & 0x07; // Set Second Type of Character gObj[result].Class = this->bot[botNum].Class; gObj[result].Level = 400; gObj[result].Life = 1; gObj[result].MaxLife = 2; gObj[result].Mana = 1; gObj[result].MaxMana = 2; gObj[result].Experience = 0; gObj[result].DbClass = this->bot[botNum].Class; gObj[result].pInventory = new CItem[INVENTORY_NORMAL_SIZE]; gObj[result].Inventory1 = new CItem[INVENTORY_NORMAL_SIZE]; gObj[result].InventoryMap1 = new BYTE[INVENTORY_NORMAL_SIZE]; gObj[result].pInventoryMap = new BYTE[INVENTORY_NORMAL_SIZE]; for (int i=0;i<INVENTORY_NORMAL_SIZE;i++) { gObj[result].pInventory[i].Clear(); gObj[result].Inventory1[i].Clear(); } memset(&gObj[result].pInventoryMap[0], (BYTE)-1, INVENTORY_NORMAL_SIZE); memset(&gObj[result].InventoryMap1[0], (BYTE)-1, INVENTORY_NORMAL_SIZE); strncpy(gObj[result].Name,this->bot[botNum].Name,sizeof(gObj[result].Name)); for(int i=0;i<9;i++) { if(this->bot[botNum].body[i].num >= 0 && this->bot[botNum].body[i].Enabled == true) { CItem item; item.m_Level = this->bot[botNum].body[i].level; item.m_SkillOption = 0; item.m_LuckOption = 1; item.m_Z28Option = this->bot[botNum].body[i].opt; item.m_Durability = 255.0f; item.m_JewelOfHarmonyOption = 0; item.m_ItemOptionEx = 0; item.m_ItemSlot1 = 0; item.m_ItemSlot2 = 0; item.m_ItemSlot3 = 0; item.m_ItemSlot4 = 0; item.m_ItemSlot5 = 0; item.Convert(this->bot[botNum].body[i].num,item.m_SkillOption,item.m_LuckOption,item.m_Z28Option,0,0,item.m_ItemOptionEx,3); gObj[result].pInventory[i].m_SkillOption = item.m_SkillOption; gObj[result].pInventory[i].m_LuckOption = item.m_LuckOption; gObj[result].pInventory[i].m_Z28Option = item.m_Z28Option; gObj[result].pInventory[i].m_JewelOfHarmonyOption = item.m_JewelOfHarmonyOption; gObj[result].pInventory[i].m_ItemOptionEx = item.m_ItemOptionEx; item.m_Number = 0; gObjInventoryInsertItemPos(gObj[result].m_Index,item,i,0); } } gObj[result].Inventory1 = gObj[result].pInventory; gObj[result].InventoryMap1 = gObj[result].pInventoryMap; gObjMakePreviewCharSet(result); gObj[result].m_AttackType = 0; gObj[result].BotSkillAttack = 0; gObj[result].m_Attribute = 100; gObj[result].TargetNumber = (WORD)-1; gObj[result].m_ActState.Emotion = 0; gObj[result].m_ActState.Attack = 0; gObj[result].m_ActState.EmotionCount = 0; gObj[result].PathCount = 0; gObj[result].BotPower = 0; gObj[result].BotDefense = this->bot[botNum].OnlyVip; gObj[result].BotLife = 1; gObj[result].BotMaxLife = 1; gObj[result].BotLvlUpDefense = 1; gObj[result].BotLvlUpPower = 1; gObj[result].BotLvlUpLife = 1; gObj[result].BotLvlUpMana = 1; gObj[result].BotLvlUpExp = 1; gObj[result].BotLvlUpMaxLevel = 1; gObj[result].m_MoveRange = 1; gObj[result].BotFollowMe = 0; gObj[result].NextExp = gLevelExperience[gObj[result].Level]; GCRecallMonLife(gObj[result].m_RecallMon,gObj[result].MaxLife,gObj[result].Life); ChatSend(&gObj[result],"I'll Warp you!"); GCActionSend(&gObj[result],AT_SALUTE1,result,result); } } } } }
BOOL TMonsterAIElement::ApplyElementAttack(int iIndex, int iTargetIndex, TMonsterAIState * pAIState) { LPOBJ lpObj = &gObj[iIndex]; UTIL.SendCrywolfChattingMsg(iIndex, "Element-공격"); if ( TMonsterSkillManager::CheckMonsterSkill(lpObj->Class) ) { BOOL bEnableAttack = TRUE; if ( lpObj->TargetNumber < 0 ) { lpObj->TargetNumber = -1; lpObj->m_ActState.Emotion = 0; lpObj->m_ActState.Attack = 0; lpObj->m_ActState.Move = 0; lpObj->NextActionTime = 1000; return FALSE; } if ( !gObj[lpObj->TargetNumber].Live || gObj[lpObj->TargetNumber].Teleport ) bEnableAttack = FALSE; if ( gObj[lpObj->TargetNumber].Connected <= PLAYER_LOGGED || gObj[lpObj->TargetNumber].CloseCount != -1 ) { bEnableAttack = FALSE; } if ( !bEnableAttack ) { lpObj->TargetNumber = -1; lpObj->m_ActState.Emotion = 0; lpObj->m_ActState.Attack = 0; lpObj->m_ActState.Move = 0; lpObj->NextActionTime = 1000; return FALSE; } LPOBJ lpTargetObj = &gObj[lpObj->TargetNumber]; lpObj->Dir = GetPathPacketDirPos(lpTargetObj->X - lpObj->X, lpTargetObj->Y - lpObj->Y); if ( (rand()%4) == 0 ) { PMSG_ATTACK pAttackMsg; pAttackMsg.AttackAction = 0x78; pAttackMsg.DirDis = lpObj->Dir; pAttackMsg.NumberH = SET_NUMBERH(lpObj->TargetNumber); pAttackMsg.NumberL = SET_NUMBERL(lpObj->TargetNumber); GCActionSend(lpObj, 0x78, lpObj->m_Index, 0); gObjAttack(lpObj, &gObj[lpObj->TargetNumber], 0, 0, 0, 0, 0,0,0); } else { TMonsterSkillManager::UseMonsterSkill(lpObj->m_Index, lpObj->TargetNumber, 0, -1, 0); } lpObj->m_ActState.Attack = 0; return FALSE; } else { if( lpObj->TargetNumber < 0 ) return FALSE; LPOBJ lpTargetObj = &gObj[lpObj->TargetNumber]; lpObj->Dir = GetPathPacketDirPos(lpTargetObj->X - lpObj->X, lpTargetObj->Y - lpObj->Y); PMSG_ATTACK pAttackMsg; pAttackMsg.AttackAction = 0x78; pAttackMsg.DirDis = lpObj->Dir; pAttackMsg.NumberH = SET_NUMBERH(lpObj->TargetNumber); pAttackMsg.NumberL = SET_NUMBERL(lpObj->TargetNumber); CGAttack((PMSG_ATTACK *)&pAttackMsg, lpObj->m_Index); GCActionSend(lpObj, 0x78, lpObj->m_Index, lpTargetObj->m_Index); gObjAttack(lpObj, &gObj[lpObj->TargetNumber], 0, 0, 0, 0, 0,0,0); return FALSE; } }