void SpawnCatch(CCharEntity* PChar, uint32 mobid) { CBattleEntity* TargetID = (CBattleEntity*)PChar; CMobEntity* PMob = (CMobEntity*)zoneutils::GetEntity(mobid, TYPE_MOB); if (PMob->PBattleAI->GetCurrentAction() == ACTION_NONE) { PMob->SetDespawnTimer(3); PMob->m_AllowRespawn = false; PMob->m_Type = MOBTYPE_FISHED; PMob->CanDetectTarget(TargetID, true); PMob->m_Behaviour = BEHAVIOUR_NO_TURN; PMob->m_SpawnPoint = nearPosition(PChar->loc.p, 2.2f, M_PI); PMob->PBattleAI->SetLastActionTime(gettick()); PMob->PBattleAI->SetCurrentAction(ACTION_SPAWN); PMob->PBattleAI->CheckCurrentAction(gettick()); PMob->PEnmityContainer->AddBaseEnmity(TargetID); } }
void CZoneEntities::TOTDChange(TIMETYPE TOTD) { SCRIPTTYPE ScriptType = SCRIPT_NONE; switch (TOTD) { case TIME_MIDNIGHT: { } break; case TIME_NEWDAY: { for (EntityList_t::const_iterator it = m_mobList.begin(); it != m_mobList.end(); ++it) { CMobEntity* PMob = (CMobEntity*)it->second; if (PMob->m_SpawnType == SPAWNTYPE_ATNIGHT) { PMob->SetDespawnTimer(1); PMob->m_AllowRespawn = false; } } } break; case TIME_DAWN: { ScriptType = SCRIPT_TIME_DAWN; for (EntityList_t::const_iterator it = m_mobList.begin(); it != m_mobList.end(); ++it) { CMobEntity* PMob = (CMobEntity*)it->second; if (PMob->m_SpawnType == SPAWNTYPE_ATEVENING) { PMob->SetDespawnTimer(1); PMob->m_AllowRespawn = false; } } } break; case TIME_DAY: { ScriptType = SCRIPT_TIME_DAY; } break; case TIME_DUSK: { ScriptType = SCRIPT_TIME_DUSK; } break; case TIME_EVENING: { ScriptType = SCRIPT_TIME_EVENING; for (EntityList_t::const_iterator it = m_mobList.begin(); it != m_mobList.end(); ++it) { CMobEntity* PMob = (CMobEntity*)it->second; if (PMob->m_SpawnType == SPAWNTYPE_ATEVENING) { PMob->SetDespawnTimer(0); PMob->m_AllowRespawn = true; PMob->PBattleAI->SetCurrentAction(ACTION_SPAWN); } } } break; case TIME_NIGHT: { for (EntityList_t::const_iterator it = m_mobList.begin(); it != m_mobList.end(); ++it) { CMobEntity* PMob = (CMobEntity*)it->second; if (PMob->m_SpawnType == SPAWNTYPE_ATNIGHT) { PMob->SetDespawnTimer(0); PMob->m_AllowRespawn = true; PMob->PBattleAI->SetCurrentAction(ACTION_SPAWN); } } } break; } if (ScriptType != SCRIPT_NONE) { for (EntityList_t::const_iterator it = m_charList.begin(); it != m_charList.end(); ++it) { charutils::CheckEquipLogic((CCharEntity*)it->second, ScriptType, TOTD); } } }
void LoadMOBList() { const int8* Query = "SELECT zoneid, name, mobid, pos_rot, pos_x, pos_y, pos_z, \ respawntime, spawntype, dropid, mob_groups.HP, mob_groups.MP, minLevel, maxLevel, \ modelid, mJob, sJob, cmbSkill, cmbDmgMult, cmbDelay, behavior, links, mobType, immunity, \ systemid, mobsize, speed, \ STR, DEX, VIT, AGI, `INT`, MND, CHR, EVA, DEF, \ Slash, Pierce, H2H, Impact, \ Fire, Ice, Wind, Earth, Lightning, Water, Light, Dark, Element, \ mob_pools.familyid, name_prefix, unknown, animationsub, \ (mob_family_system.HP / 100), (mob_family_system.MP / 100), hasSpellScript, spellList, ATT, ACC, mob_groups.poolid \ FROM mob_groups INNER JOIN mob_pools ON mob_groups.poolid = mob_pools.poolid \ INNER JOIN mob_spawn_points ON mob_groups.groupid = mob_spawn_points.groupid \ INNER JOIN mob_family_system ON mob_pools.familyid = mob_family_system.familyid \ WHERE NOT (pos_x = 0 AND pos_y = 0 AND pos_z = 0);"; int32 ret = Sql_Query(SqlHandle, Query); if( ret != SQL_ERROR && Sql_NumRows(SqlHandle) != 0) { while(Sql_NextRow(SqlHandle) == SQL_SUCCESS) { uint16 ZoneID = (uint16)Sql_GetUIntData(SqlHandle, 0); CMobEntity* PMob = new CMobEntity; PMob->name.insert(0,Sql_GetData(SqlHandle,1)); PMob->id = (uint32)Sql_GetUIntData(SqlHandle,2); PMob->targid = (uint16)PMob->id & 0x0FFF; PMob->m_SpawnPoint.rotation = (uint8)Sql_GetIntData(SqlHandle,3); PMob->m_SpawnPoint.x = Sql_GetFloatData(SqlHandle,4); PMob->m_SpawnPoint.y = Sql_GetFloatData(SqlHandle,5); PMob->m_SpawnPoint.z = Sql_GetFloatData(SqlHandle,6); PMob->m_RespawnTime = Sql_GetUIntData(SqlHandle,7) * 1000; PMob->m_SpawnType = (SPAWNTYPE)Sql_GetUIntData(SqlHandle,8); PMob->m_DropID = Sql_GetUIntData(SqlHandle,9); PMob->HPmodifier = (uint32)Sql_GetIntData(SqlHandle,10); PMob->MPmodifier = (uint32)Sql_GetIntData(SqlHandle,11); PMob->m_minLevel = (uint8)Sql_GetIntData(SqlHandle,12); PMob->m_maxLevel = (uint8)Sql_GetIntData(SqlHandle,13); memcpy(&PMob->look,Sql_GetData(SqlHandle,14),23); PMob->SetMJob(Sql_GetIntData(SqlHandle,15)); PMob->SetSJob(Sql_GetIntData(SqlHandle,16)); PMob->m_Weapons[SLOT_MAIN]->setMaxHit(1); PMob->m_Weapons[SLOT_MAIN]->setSkillType(Sql_GetIntData(SqlHandle,17)); PMob->m_dmgMult = Sql_GetUIntData(SqlHandle, 18); PMob->m_Weapons[SLOT_MAIN]->setDelay((Sql_GetIntData(SqlHandle,19) * 1000)/60); PMob->m_Weapons[SLOT_MAIN]->setBaseDelay((Sql_GetIntData(SqlHandle,19) * 1000)/60); PMob->m_Behaviour = (uint16)Sql_GetIntData(SqlHandle,20); PMob->m_Link = (uint8)Sql_GetIntData(SqlHandle,21); PMob->m_Type = (uint8)Sql_GetIntData(SqlHandle,22); PMob->m_Immunity = (IMMUNITY)Sql_GetIntData(SqlHandle,23); PMob->m_EcoSystem = (ECOSYSTEM)Sql_GetIntData(SqlHandle,24); PMob->m_ModelSize += (uint8)Sql_GetIntData(SqlHandle,25); PMob->speed = (uint8)Sql_GetIntData(SqlHandle,26); PMob->speedsub = (uint8)Sql_GetIntData(SqlHandle,26); /*if(PMob->speed != 0) { PMob->speed += map_config.speed_mod; // whats this for? PMob->speedsub += map_config.speed_mod; }*/ PMob->strRank = (uint8)Sql_GetIntData(SqlHandle,27); PMob->dexRank = (uint8)Sql_GetIntData(SqlHandle,28); PMob->vitRank = (uint8)Sql_GetIntData(SqlHandle,29); PMob->agiRank = (uint8)Sql_GetIntData(SqlHandle,30); PMob->intRank = (uint8)Sql_GetIntData(SqlHandle,31); PMob->mndRank = (uint8)Sql_GetIntData(SqlHandle,32); PMob->chrRank = (uint8)Sql_GetIntData(SqlHandle,33); PMob->evaRank = (uint8)Sql_GetIntData(SqlHandle,34); PMob->defRank = (uint8)Sql_GetIntData(SqlHandle,35); PMob->attRank = (uint8)Sql_GetIntData(SqlHandle,57); PMob->accRank = (uint8)Sql_GetIntData(SqlHandle,58); PMob->setModifier(MOD_SLASHRES, (uint16)(Sql_GetFloatData(SqlHandle,36) * 1000)); PMob->setModifier(MOD_PIERCERES,(uint16)(Sql_GetFloatData(SqlHandle,37) * 1000)); PMob->setModifier(MOD_HTHRES, (uint16)(Sql_GetFloatData(SqlHandle,38) * 1000)); PMob->setModifier(MOD_IMPACTRES,(uint16)(Sql_GetFloatData(SqlHandle,39) * 1000)); PMob->setModifier(MOD_FIREDEF, (int16)((Sql_GetFloatData(SqlHandle, 40) - 1) * -1000)); // These are stored as floating percentages PMob->setModifier(MOD_ICEDEF, (int16)((Sql_GetFloatData(SqlHandle, 41) - 1) * -1000)); // and need to be adjusted into modifier units. PMob->setModifier(MOD_WINDDEF, (int16)((Sql_GetFloatData(SqlHandle, 42) - 1) * -1000)); // Higher DEF = lower damage. PMob->setModifier(MOD_EARTHDEF, (int16)((Sql_GetFloatData(SqlHandle, 43) - 1) * -1000)); // Negatives signify increased damage. PMob->setModifier(MOD_THUNDERDEF, (int16)((Sql_GetFloatData(SqlHandle, 44) - 1) * -1000)); // Positives signify reduced damage. PMob->setModifier(MOD_WATERDEF, (int16)((Sql_GetFloatData(SqlHandle, 45) - 1) * -1000)); // Ex: 125% damage would be 1.25, 50% damage would be 0.50 PMob->setModifier(MOD_LIGHTDEF, (int16)((Sql_GetFloatData(SqlHandle, 46) - 1) * -1000)); // (1.25 - 1) * -1000 = -250 DEF PMob->setModifier(MOD_DARKDEF, (int16)((Sql_GetFloatData(SqlHandle, 47) - 1) * -1000)); // (0.50 - 1) * -1000 = 500 DEF PMob->setModifier(MOD_FIRERES, (int16)((Sql_GetFloatData(SqlHandle, 40) - 1) * -100)); // These are stored as floating percentages PMob->setModifier(MOD_ICERES, (int16)((Sql_GetFloatData(SqlHandle, 41) - 1) * -100)); // and need to be adjusted into modifier units. PMob->setModifier(MOD_WINDRES, (int16)((Sql_GetFloatData(SqlHandle, 42) - 1) * -100)); // Higher RES = lower damage. PMob->setModifier(MOD_EARTHRES, (int16)((Sql_GetFloatData(SqlHandle, 43) - 1) * -100)); // Negatives signify lower resist chance. PMob->setModifier(MOD_THUNDERRES, (int16)((Sql_GetFloatData(SqlHandle, 44) - 1) * -100)); // Positives signify increased resist chance. PMob->setModifier(MOD_WATERRES, (int16)((Sql_GetFloatData(SqlHandle, 45) - 1) * -100)); PMob->setModifier(MOD_LIGHTRES, (int16)((Sql_GetFloatData(SqlHandle, 46) - 1) * -100)); PMob->setModifier(MOD_DARKRES, (int16)((Sql_GetFloatData(SqlHandle, 47) - 1) * -100)); PMob->m_Element = (uint8)Sql_GetIntData(SqlHandle,48); PMob->m_Family = (uint16)Sql_GetIntData(SqlHandle,49); PMob->m_name_prefix = (uint8)Sql_GetIntData(SqlHandle,50); PMob->m_unknown = (uint32)Sql_GetIntData(SqlHandle,51); //Special sub animation for Mob (yovra, jailer of love, phuabo) // yovra 1: en hauteur, 2: en bas, 3: en haut // phuabo 1: sous l'eau, 2: sort de l'eau, 3: rentre dans l'eau PMob->animationsub = (uint32)Sql_GetIntData(SqlHandle,52); // Setup HP / MP Stat Percentage Boost PMob->HPscale = Sql_GetFloatData(SqlHandle,53); PMob->MPscale = Sql_GetFloatData(SqlHandle,54); PMob->PBattleAI = new CAIMobDummy(PMob); if (PMob->m_AllowRespawn = PMob->m_SpawnType == SPAWNTYPE_NORMAL) { PMob->PBattleAI->SetCurrentAction(ACTION_SPAWN); } // Check if we should be looking up scripts for this mob PMob->m_HasSpellScript = (uint8)Sql_GetIntData(SqlHandle,55); PMob->m_SpellListContainer = mobSpellList::GetMobSpellList(Sql_GetIntData(SqlHandle,56)); PMob->m_Pool = Sql_GetUIntData(SqlHandle,59); // must be here first to define mobmods mobutils::InitializeMob(PMob, GetZone(ZoneID)); GetZone(ZoneID)->InsertMOB(PMob); luautils::OnMobInitialize(PMob); PMob->saveModifiers(); PMob->saveMobModifiers(); } } // attach pets to mobs const int8* PetQuery = "SELECT zoneid, mob_mobid, pet_offset \ FROM mob_pets \ LEFT JOIN mob_spawn_points ON mob_pets.mob_mobid = mob_spawn_points.mobid \ LEFT JOIN mob_groups ON mob_spawn_points.groupid = mob_groups.groupid;"; ret = Sql_Query(SqlHandle, PetQuery); if( ret != SQL_ERROR && Sql_NumRows(SqlHandle) != 0) { while(Sql_NextRow(SqlHandle) == SQL_SUCCESS) { uint16 ZoneID = (uint16)Sql_GetUIntData(SqlHandle, 0); uint32 masterid = (uint32)Sql_GetUIntData(SqlHandle,1); uint32 petid = masterid + (uint32)Sql_GetUIntData(SqlHandle,2); CMobEntity* PMaster = (CMobEntity*)GetZone(ZoneID)->GetEntity(masterid & 0x0FFF, TYPE_MOB); CMobEntity* PPet = (CMobEntity*)GetZone(ZoneID)->GetEntity(petid & 0x0FFF, TYPE_MOB); if(PMaster == NULL) { ShowError("zoneutils::loadMOBList PMaster is null. masterid: %d. Make sure x,y,z are not zeros, and that all entities are entered in the database!\n", masterid); } else if(PPet == NULL) { ShowError("zoneutils::loadMOBList PPet is null. petid: %d. Make sure x,y,z are not zeros!\n", petid); } else if(masterid == petid) { ShowError("zoneutils::loadMOBList Master and Pet are the same entity: %d\n", masterid); } else { // pet is always spawned by master PPet->m_AllowRespawn = false; PPet->m_SpawnType = SPAWNTYPE_SCRIPTED; PPet->PBattleAI->SetCurrentAction(ACTION_NONE); PPet->SetDespawnTimer(0); PMaster->PPet = PPet; PPet->PMaster = PMaster; } } } }