void GetTitanReward(SDHP_GETREWARD_INFOSAVE * lpMsg) { char szId[11]={0}; int aIndex = 0; szId[MAX_ACCOUNT_LEN]=0; memcpy(szId, lpMsg->AccountID, sizeof(lpMsg->AccountID)); aIndex = lpMsg->aIndex; if ( !gObjIsAccontConnect(aIndex, szId)) { LogAddC(2, lMsg.Get(MSGGET(1, 175)), szId, aIndex); return; } LPOBJ lpObj = &gObj[aIndex]; if (( lpObj->m_Index == aIndex) && (!strcmp(lpMsg->Name,lpObj->Name))) { char exVipMoney[512]={0}; char exZen[512]={0}; wsprintf(exVipMoney,"VipMoney increased in %d",lpMsg->rew.VipMoney); wsprintf(exZen,"Zen increased in %d",lpMsg->rew.Zen); if(lpMsg->ID_Num >= 0) { if(lpMsg->rew.num != (WORD) -1) { if(lpMsg->rew.Days == 0) { PMSG_BUYSHOPRESULT pResult; PHeadSetB((LPBYTE)&pResult, 0x32, sizeof(pResult)); CItem item; item.m_Level = lpMsg->rew.Level; item.m_SkillOption = lpMsg->rew.Skill; item.m_LuckOption = lpMsg->rew.Luck; item.m_Z28Option = lpMsg->rew.Opt; item.m_Durability = lpMsg->rew.Dur; item.m_ItemOptionEx = lpMsg->rew.Exc; item.m_JewelOfHarmonyOption = 0; if(lpMsg->rew.JOH > 0) { int btOptionLevel = item.m_Level; if(btOptionLevel > ReadConfig.JOHLevelMax) btOptionLevel = ReadConfig.JOHLevelMax; item.m_JewelOfHarmonyOption |= lpMsg->rew.JOH << 4; item.m_JewelOfHarmonyOption |= btOptionLevel & 0x0F; } item.Convert(lpMsg->rew.num, lpMsg->rew.Skill, lpMsg->rew.Luck, lpMsg->rew.Opt, lpMsg->rew.Exc, 0, 0, CURRENT_DB_VERSION); item.m_Durability = item.m_BaseDurability; item.m_ItemSlot1 = lpMsg->rew.Sock1; item.m_ItemSlot2 = lpMsg->rew.Sock2; item.m_ItemSlot3 = lpMsg->rew.Sock3; item.m_ItemSlot4 = lpMsg->rew.Sock4; item.m_ItemSlot5 = lpMsg->rew.Sock5; item.Value(); pResult.Result = gObjShopBuyInventoryInsertItem(lpObj->m_Index,item); if ( pResult.Result != 0xFF ) { DelTitanReward(aIndex,lpMsg->ID_Num); if(lpMsg->rew.IsForeverFFFE == 1) lpObj->pInventory[pResult.Result].m_Number = 0xFFFFFFFE; ItemByteConvert((LPBYTE)&pResult.ItemInfo, item); DataSend(aIndex, (LPBYTE)&pResult, pResult.h.size); if(lpMsg->rew.VipMoney > 0) { lpObj->AccountExtraInfoModified = 1; lpObj->VipMoney += lpMsg->rew.VipMoney; GCServerMsgStringSend(exVipMoney, lpObj->m_Index, 0x01); } if(lpMsg->rew.Zen > 0) { if((__int64)(lpMsg->rew.Zen + gObj[aIndex].Money) > (__int64)MAX_ZEN) gObj[aIndex].Money = MAX_ZEN; else gObj[aIndex].Money += lpMsg->rew.Zen; ::GCMoneySend(aIndex, gObj[aIndex].Money); GCServerMsgStringSend(exZen, lpObj->m_Index, 0x01); } GCServerMsgStringSend("Get Reward Success!", aIndex, 0x01); char sbuf[512]={0}; wsprintf(sbuf,"[BotReward](%s)(%s) Buy Item:%d(%d %d) ID_DB:%d [LVL:%d O:%d L:%d S:%d E:%d]", gObj[aIndex].AccountID,gObj[aIndex].Name, lpMsg->rew.num, lpMsg->rew.num/512, lpMsg->rew.num-((int)(lpMsg->rew.num/512)*512), lpMsg->ID_Num, lpMsg->rew.Level,lpMsg->rew.Opt,lpMsg->rew.Luck,lpMsg->rew.Skill,lpMsg->rew.Exc); LogAddTD(sbuf); BOTREWARD_LOG.Output(sbuf); } }else { time_t t = time(NULL); localtime(&t); DWORD iTime = (DWORD)t + lpMsg->rew.Days * 86400; BYTE iItemPos = gObjInventoryInsertItem(&gObj[aIndex], ITEM_GET_TYPE(lpMsg->rew.num), ITEM_GET_INDEX(lpMsg->rew.num), lpMsg->rew.Level, iTime, 0xff,0,0,0,0,0); if ( iItemPos != (BYTE)-1 ) { DelTitanReward(aIndex,lpMsg->ID_Num); gObj[aIndex].pInventory[iItemPos].m_JewelOfHarmonyOption = 0; if(lpMsg->rew.JOH > 0) { int btOptionLevel = gObj[aIndex].pInventory[iItemPos].m_Level; if(btOptionLevel > ReadConfig.JOHLevelMax) btOptionLevel = ReadConfig.JOHLevelMax; gObj[aIndex].pInventory[iItemPos].m_JewelOfHarmonyOption |= lpMsg->rew.JOH << 4; gObj[aIndex].pInventory[iItemPos].m_JewelOfHarmonyOption |= btOptionLevel & 0x0F; } gObj[aIndex].pInventory[iItemPos].Convert(lpMsg->rew.num, lpMsg->rew.Skill, lpMsg->rew.Luck, lpMsg->rew.Opt, lpMsg->rew.Exc, 0, 0, CURRENT_DB_VERSION); BYTE btItemType=0; btItemType |= (lpMsg->rew.num & 0x1E00 ) >> 5; gObj[aIndex].pInventory[iItemPos].m_ItemOptionEx = btItemType+2; gObj[aIndex].pInventory[iItemPos].m_ItemSlot1 = lpMsg->rew.Sock1; gObj[aIndex].pInventory[iItemPos].m_ItemSlot2 = lpMsg->rew.Sock2; gObj[aIndex].pInventory[iItemPos].m_ItemSlot3 = lpMsg->rew.Sock3; gObj[aIndex].pInventory[iItemPos].m_ItemSlot4 = lpMsg->rew.Sock4; gObj[aIndex].pInventory[iItemPos].m_ItemSlot5 = lpMsg->rew.Sock5; ::GCInventoryItemOneSend(aIndex, iItemPos); MuItemShop.ItemSendTime(aIndex,iItemPos); if(lpMsg->rew.VipMoney > 0) { lpObj->AccountExtraInfoModified = 1; lpObj->VipMoney += lpMsg->rew.VipMoney; GCServerMsgStringSend(exVipMoney, lpObj->m_Index, 0x01); } if(lpMsg->rew.Zen > 0) { if((__int64)(lpMsg->rew.Zen + gObj[aIndex].Money) > (__int64)MAX_ZEN) gObj[aIndex].Money = MAX_ZEN; else gObj[aIndex].Money += lpMsg->rew.Zen; ::GCMoneySend(aIndex, gObj[aIndex].Money); GCServerMsgStringSend(exZen, lpObj->m_Index, 0x01); } char sbuf[512]={0}; GCServerMsgStringSend("Get Reward Success!", lpObj->m_Index, 0x01); wsprintf(sbuf,"[BotReward](%s)(%s) Buy Item:%d(%d %d) ID_DB:%d [LVL:%d O:%d L:%d S:%d E:%d]", gObj[aIndex].AccountID,gObj[aIndex].Name, lpMsg->rew.num, lpMsg->rew.num/512, lpMsg->rew.num-((int)(lpMsg->rew.num/512)*512), lpMsg->ID_Num, lpMsg->rew.Level,lpMsg->rew.Opt,lpMsg->rew.Luck,lpMsg->rew.Skill,lpMsg->rew.Exc); LogAddTD(sbuf); BOTREWARD_LOG.Output(sbuf); } } }else { if(lpMsg->rew.VipMoney > 0)
// ----------------------------------------------------------------------------------------------------------------------- bool CIllusionTemple::NpcTalk(OBJECTSTRUCT* lpNpc, OBJECTSTRUCT* lpObj) { if ( (lpObj->m_IfState.use) > 0 ) { return true; } switch(lpNpc->Class) { case 385: { int templeIndex = this->GetObjTempleIndex(lpObj); if(templeIndex != -1) { if(templeIndex >= 0 && templeIndex < MAX_ILLUSION_TEMPLES) { if(!(this->m_IllusionTemple[templeIndex].m_TempleState == IT_STATE_OPEN)) { char szBuff[100] = {0}; if(this->m_IllusionTemple[templeIndex].m_TempleState == IT_STATE_CLOSED) { sprintf(&szBuff[0], "IT Event will be Opened in %d Minute(s).", (this->m_IllusionTemple[0].m_RemainTime / 60000) - 4); } else { sprintf(&szBuff[0], "IT Event is Running Now, Try again Later!", (this->m_IllusionTemple[0].m_RemainTime / 60000) - 4); } ChatTargetSend(lpNpc, &szBuff[0], lpObj->m_Index); } else { PMSG_ILLUSION_NPC pMsg; pMsg.MemberCount = this->GetUserCount(templeIndex); pMsg.State = 0; gSendProto.DataSend(lpObj->m_Index, (unsigned char*)&pMsg, pMsg.h.size); ChatTargetSend(lpNpc, "Illusion Temple Event Awaits You!", lpObj->m_Index); } } else { ChatTargetSend(lpNpc, "Sorry, You are not allowed to enter the IT Event.", lpObj->m_Index); CLog.LogAddC(2, "[IllusionTemple] Gate Index Error (%d)(%s).", templeIndex, &lpObj->Name[0]); } } else { ChatTargetSend(lpNpc, "You don't have sufficient Level to Enter IT Event.", lpObj->m_Index); } } return TRUE; case 380: { if(IT_FLOOR_RANGE(lpObj->m_IllusionIndex) && IT_MAP_RANGE(lpObj->MapNumber)) { if(this->m_IllusionTemple[lpObj->m_IllusionIndex].m_BallOwner == lpNpc->m_Index) { BYTE ItemPosition = gObjInventoryInsertItem(lpObj, 14, 64, 0); if(ItemPosition != -1) { GCInventoryItemOneSend(lpObj->m_Index, ItemPosition); this->m_IllusionTemple[lpObj->m_IllusionIndex].m_BallOwner = lpObj->m_Index; } else { GCServerMsgStringSend("You do not have space to capture the artifact!", lpObj->m_Index, 1); } // Need To be Translated By Testers "Você não tem espaço para capturar o artefato!" } else { GCServerMsgStringSend("The artifact is not in the statue!", lpObj->m_Index, 1); } // Need To be Translated By Testers "O artefato não se encontra nesta estátua!" } } return TRUE; case 383: // Blue case 384: { int iTeam = lpNpc->Class == 383 ? IT_TEAM_BLUE : IT_TEAM_RED; if(IT_FLOOR_RANGE(lpObj->m_IllusionIndex) && IT_MAP_RANGE(lpObj->MapNumber)) { bool bFound = false; for(int i = 0; i < INVENTORY_SIZE; i++) { if(lpObj->pInventory[i].IsItem()) { if(lpObj->pInventory[i].m_Type == ITEMGET(14, 64)) { gObjInventoryDeleteItem(lpObj->m_Index, i); GCInventoryItemDeleteSend(lpObj->m_Index, i, 1); bFound = true; } } } if(bFound) { this->m_IllusionTemple[lpObj->m_IllusionIndex].m_BallOwner = this->m_IllusionTemple[lpObj->m_IllusionIndex].m_Statues[rand()%MAX_IT_STATUES]; this->m_IllusionTemple[lpObj->m_IllusionIndex].m_Teams[iTeam].m_Score++; } } } return TRUE; default: return TRUE; } }
void CLuckyCoin::ExchangeCoin(LPOBJ lpObj,int Type) { int Count = 0; BYTE Socket[5]; Socket[0] = 0xFF; Socket[1] = 0xFF; Socket[2] = 0xFF; Socket[3] = 0xFF; Socket[4] = 0xFF; CItem item; // ---- switch ( Type ) { case 0: // -- 10 Coin Change Count = gLuckyCoin.GetCoinCount(lpObj); if ( Count < 10 ) { GCServerMsgStringSend("[LuckyCoin]: Need 10 coins",lpObj->m_Index,1); return; } else { item.m_Type = ITEMGET(14,13); // ---- if ( gObjInventoryInsertItem(lpObj->m_Index,item) == -1 ) { return; } for (int i=0;i<10;i++) { gLuckyCoin.DeleteCoin(lpObj); } //ItemSerialCreateSend(lpObj->m_Index,236,0,0,ITEMGET(14,14),0,0,0,0,0,lpObj->m_Index,0,0,Socket); } break; case 1: // -- 20 Coin Change Count = gLuckyCoin.GetCoinCount(lpObj); if ( Count < 20 ) { GCServerMsgStringSend("[LuckyCoin]: Need 20 coins",lpObj->m_Index,1); return; } else { item.m_Type = ITEMGET(14,14); // ---- if ( gObjInventoryInsertItem(lpObj->m_Index,item) == -1 ) { return; } for (int i=0;i<20;i++) { gLuckyCoin.DeleteCoin(lpObj); } //ItemSerialCreateSend(lpObj->m_Index,236,0,0,ITEMGET(14,13),0,0,0,0,0,lpObj->m_Index,0,0,Socket); } break; case 2: // -- 30 Coin Change Count = gLuckyCoin.GetCoinCount(lpObj); if ( Count < 30 ) { GCServerMsgStringSend("[LuckyCoin]: Need 30 coins",lpObj->m_Index,1); return; } else { item.m_Type = ITEMGET(14,16); // ---- if ( gObjInventoryInsertItem(lpObj->m_Index,item) == -1 ) { return; } for (int i=0;i<30;i++) { gLuckyCoin.DeleteCoin(lpObj); } //ItemSerialCreateSend(lpObj->m_Index,236,0,0,ITEMGET(14,16),0,0,0,0,0,lpObj->m_Index,0,0,Socket); } break; } }
bool CQuest::MonsterItemDrop(LPOBJ lpObj) { int MaxHitUser = gObjMonsterTopHitDamageUser(lpObj); if ( MaxHitUser == -1 ) { return false; } int partycount = gParty.GetPartyCount(gObj[MaxHitUser].PartyNumber); if ( partycount > 0 ) { return false; } int type; int level = 0; int x; int y; float dur = 0; int Option1 = 0; int Option2 = 0; int Option3 = 0; LPOBJ lpTarget = &gObj[MaxHitUser]; int qIndex = lpTarget->q_QuestIndex; if(lpTarget->q_QuestState != QUEST_STATE_ONGOING) { return false; } QuestAtt * lpQuest = &this->quests[qIndex]; if ( lpQuest != NULL ) { for(int i = 0 ; i != lpQuest->QuestsObjectCount; i++) { QuestObjectItem * lpQitem = &lpQuest->ItemsObject[i]; for(int n = 0 ; n != lpQitem->QuestMobCount; n++) { if(lpQuest->QuestKilledCount >= lpQitem->QuestMob[n].count) { dur = 0; x = lpObj->X; y = lpObj->Y; type = ItemGetNumberMake(lpQitem->itemType,lpQitem->itemSubType); CItem uItem; uItem.Convert(type ,0,0,0,0,0,0,CURRENT_DB_VERSION); BYTE uPos = gObjInventoryInsertItem(lpTarget->m_Index,uItem); GCInventoryItemOneSend(lpTarget->m_Index, uPos); LogAddTD("[Quest] Quest Item Insert [%s]: [%s][%s] (%s) (%d,%d)", lpObj->Name,lpTarget->AccountID, lpTarget->Name, lpQuest->name, lpQitem->itemType,lpQitem->itemSubType); qMsg->Notice(lpTarget->m_Index, "[Quest] You're item in invnotry!! "); this->SetQuestState(lpTarget , qIndex , QUEST_STATE_FINISH ); lpQuest->QuestKilledCount = 0; } else if(lpObj->Level >= lpQitem->QuestMob[n].minLevel && lpObj->Level <= lpQitem->QuestMob[n].maxLevel) { lpQuest->QuestKilledCount++; qMsg->Msg(lpTarget->m_Index , "[Quest] you need kill more %d monsters",lpQitem->QuestMob[n].count - lpQuest->QuestKilledCount); } } } } return false; }