Alright it's actually very simple
1. Replace this code in Mobs.cpp
with this one:
2. Open up Mobs.h and add this:
under this:
3. Go back to Mobs.cpp and add this:
under this:
4. Then in Mobs.cpp add this:
under this:
Compile and play. Worked for me and that's exactly what I did.
Now my only problem is server crashing with the same old lame debug assertion error "line 242 in list"
1. Replace this code in Mobs.cpp
Code:
void Mobs::checkSpawn(int mapid){
for(unsigned int i=0; i<info[mapid].size(); i++){
int check=0;
for(unsigned int j=0; j<mobs[mapid].size(); j++){
if(i == mobs[mapid][j]->getMapID()){
check=1;
break;
}
}
if(!check){
Mob* mob = new Mob();
mobs[mapid].push_back(mob);
Pos mobpos;
mobpos.x = info[mapid][i].x;
mobpos.y = info[mapid][i].cy;
mob->setPos(mobpos);
mob->setID(i+100);
mob->setMobID(info[mapid][i].id);
mob->setMapID(i);
mob->setHP(mobinfo[info[mapid][i].id].hp);
mob->setMP(mobinfo[info[mapid][i].id].mp);
mob->setFH(info[mapid][i].fh);
mob->setType(2);
}
int num;
for(unsigned int j=0; j<mobs[mapid].size(); j++)
if(i == mobs[mapid][j]->getMapID()){
num = j;
break;
}
if(Maps::info[mapid].Players.size() > 0 && mobs[mapid][num]->getControl()==0){
int maxpos = distPos(mobs[mapid][num]->getPos(), Maps::info[mapid].Players[0]->getPos());
int posi = 0;
for(unsigned int k=0; k<Maps::info[mapid].Players.size(); k++){
int curpos = distPos(mobs[mapid][num]->getPos(), Maps::info[mapid].Players[k]->getPos());
if(curpos < maxpos){
maxpos = curpos;
posi = k;
}
}
if(!check)
MobsPacket::spawnMob(Maps::info[mapid].Players[posi], mobs[mapid][num], Maps::info[mapid].Players, 1);
mobs[mapid][num]->setControl(Maps::info[mapid].Players[posi]);
}
}
}
void Mobs::showMobs(Player* player){
for(unsigned int i=0; i<mobs[player->getMap()].size(); i++){
MobsPacket::showMob(player, mobs[player->getMap()][i]);
}
}
void Mobs::updateSpawn(int mapid){
for(unsigned int i=0; i<mobs[mapid].size(); i++){
if(Maps::info[mapid].Players.size() > 0 && mobs[mapid][i]->getControl()==NULL){
int maxpos = distPos(mobs[mapid][i]->getPos(), Maps::info[mapid].Players[0]->getPos());
int posi = 0;
for(unsigned int k=0; k<Maps::info[mapid].Players.size(); k++){
int curpos = distPos(mobs[mapid][i]->getPos(), Maps::info[mapid].Players[k]->getPos());
if(curpos < maxpos){
maxpos = curpos;
posi = k;
}
}
mobs[mapid][i]->setControl(Maps::info[mapid].Players[posi]);
}
else if(Maps::info[mapid].Players.size() == 0)
mobs[mapid][i]->setControl(NULL);
}
}
with this one:
Code:
void Mobs::checkSpawn(int mapid){
if((int)GetTickCount() > last[mapid] + 10000){
for(unsigned int i=0; i<info[mapid].size(); i++){
int check=0;
for(unsigned int j=0; j<mobs[mapid].size(); j++){
if(i == mobs[mapid][j]->getMapID()){
check=1;
break;
}
}
if(!check){
Mob* mob = new Mob();
mobs[mapid].push_back(mob);
Pos mobpos;
mobpos.x = info[mapid][i].x;
mobpos.y = info[mapid][i].cy;
mob->setPos(mobpos);
mob->setID(i+100);
mob->setMobID(info[mapid][i].id);
mob->setMapID(i);
mob->setHP(mobinfo[info[mapid][i].id].hp);
mob->setMP(mobinfo[info[mapid][i].id].mp);
mob->setFH(info[mapid][i].fh);
mob->setType(2);
}
int num;
for(unsigned int j=0; j<mobs[mapid].size(); j++)
if(i == mobs[mapid][j]->getMapID()){
num = j;
break;
}
if(Maps::info[mapid].Players.size() > 0 && mobs[mapid][num]->getControl()==0){
int maxpos = distPos(mobs[mapid][num]->getPos(), Maps::info[mapid].Players[0]->getPos());
int posi = 0;
for(unsigned int k=0; k<Maps::info[mapid].Players.size(); k++){
int curpos = distPos(mobs[mapid][num]->getPos(), Maps::info[mapid].Players[k]->getPos());
if(curpos < maxpos){
maxpos = curpos;
posi = k;
}
}
if(!check)
MobsPacket::spawnMob(Maps::info[mapid].Players[posi], mobs[mapid][num], Maps::info[mapid].Players, 1);
mobs[mapid][num]->setControl(Maps::info[mapid].Players[posi]);
}
}
last[mapid] = (int)GetTickCount();
}
}
void Mobs::showMobs(Player* player){
checkSpawn(player->getMap());
for(unsigned int i=0; i<mobs[player->getMap()].size(); i++){
MobsPacket::showMob(player, mobs[player->getMap()][i]);
}
}
void Mobs::updateSpawn(int mapid){
for(unsigned int i=0; i<mobs[mapid].size(); i++){
if(Maps::info[mapid].Players.size() > 0 && mobs[mapid][i]->getControl()==NULL){
int maxpos = distPos(mobs[mapid][i]->getPos(), Maps::info[mapid].Players[0]->getPos());
int posi = 0;
for(unsigned int k=0; k<Maps::info[mapid].Players.size(); k++){
int curpos = distPos(mobs[mapid][i]->getPos(), Maps::info[mapid].Players[k]->getPos());
if(curpos < maxpos){
maxpos = curpos;
posi = k;
}
}
mobs[mapid][i]->setControl(Maps::info[mapid].Players[posi]);
}
else if(Maps::info[mapid].Players.size() == 0)
mobs[mapid][i]->setControl(NULL);
}
}
2. Open up Mobs.h and add this:
Code:
static hash_map <int, int> last;
under this:
Code:
class Mobs {
public:
static hash_map <int, MobInfo> mobinfo;
static hash_map <int, SpawnsInfo> info;
static hash_map <int, vector<Mob*>> mobs;
3. Go back to Mobs.cpp and add this:
Code:
hash_map <int, int> Mobs::last;
under this:
Code:
hash_map <int, MobInfo> Mobs::mobinfo;
hash_map <int, SpawnsInfo> Mobs::info;
hash_map <int, vector<Mob*>> Mobs::mobs;
4. Then in Mobs.cpp add this:
Code:
checkSpawn(player->getMap());
under this:
Code:
void Mobs::monsterControl(Player* player, unsigned char* packet, int size){
Compile and play. Worked for me and that's exactly what I did.
Now my only problem is server crashing with the same old lame debug assertion error "line 242 in list"