#include "Player.h" #include "Drops.h" #include "Inventory.h" #include "Maps.h" #include "Mobs.h" #include "NPCs.h" #include "Players.h" #include "MySQLM.h" #include "PlayerPacket.h" #include "Levels.h" #include "Skills.h" #include "Quests.h" #include "Server.h" #include "PlayersPacket.h" int distPos(Pos pos1, Pos pos2){ return (int)sqrt(pow((float)(pos1.x+pos2.x), 2)+pow((float)(pos1.y+pos2.y), 2)); } Player::~Player(){ if(isconnect){ /* Added by MooMoo */ char chrSignOff[35] = ""; strcat_s(chrSignOff, 35, "'"); strcat_s(chrSignOff,35,this->getName()); strcat_s(chrSignOff, 35, "' has logged off. :("); PlayersPacket::showMassage(chrSignOff, 6, m); /* End Added By MooMoo */ Maps::removePlayer(this); Players::deletePlayer(this); char sql[2000]; sprintf_s(sql, 2000, "update keymap set "); for(int i=0; i<90; i++){ char temp[100]; if(i!=89) sprintf_s(temp, 100, "pos%d=%d, ", i, keys[i]); else sprintf_s(temp, 100, "pos%d=%d where charid=%d; ", i, keys[i], getPlayerid()); strcat_s(sql, 2000, temp); } MySQL::insert(sql); sprintf_s(sql, 2000, "update characters set level=%d, job=%d, str=%d, dex=%d, intt=%d, luk=%d, chp=%d, mhp=%d, cmp=%d, mmp=%d, ap=%d, sp=%d, exp=%d, fame=%d, map=%d, gender=%d, skin=%d, eyes=%d, hair=%d, mesos=%d where id=%d", getLevel(), getJob(), getStr(), getDex(), getInt(), getLuk(), getHP(), getMHP(), getMP(), getMMP(), getAp(), getSp(), getExp(), getFame(), getMap(), getGender(), getSkin(), getEyes(), getHair(), inv->getMesos() ,getPlayerid()); MySQL::insert(sql); char temp[100]; sprintf_s(temp, 100, "where charid=%d;", getPlayerid()); strcat_s(sql, 2000, temp); MySQL::insert(sql); sprintf_s(sql, 2000, "delete from equip where charid=%d;", getPlayerid()); MySQL::insert(sql); for(int i=0; igetEquipNum(); i++){ sprintf_s(sql, 2000, "insert into equip values(%d, %d, %d, %d, %d, %d, %d, %d, %d, %d, %d, %d, %d, %d, %d, %d, %d, %d, %d, %d, %d);", inv->getEquip(i)->id, Drops::equips[inv->getEquip(i)->id].type ,getPlayerid(), inv->getEquipPos(i), inv->getEquip(i)->slots, inv->getEquip(i)->scrolls, inv->getEquip(i)->istr, inv->getEquip(i)->idex, inv->getEquip(i)->iint, inv->getEquip(i)->iluk, inv->getEquip(i)->ihp, inv->getEquip(i)->imp, inv->getEquip(i)->iwatk, inv->getEquip(i)->imatk, inv->getEquip(i)->iwdef, inv->getEquip(i)->imdef, inv->getEquip(i)->iacc, inv->getEquip(i)->iavo, inv->getEquip(i)->ihand, inv->getEquip(i)->ijump, inv->getEquip(i)->ispeed); MySQL::insert(sql); } sprintf_s(sql, 2000, "delete from skills where charid=%d;", getPlayerid()); MySQL::insert(sql); for(int i=0; igetSkillsNum(); i++){ sprintf_s(sql, 2000, "insert into skills values(%d, %d, %d)", getPlayerid(), skills->getSkillID(i), skills->getSkillLevel(skills->getSkillID(i))); MySQL::insert(sql); } sprintf_s(sql, 2000, "delete from items where charid=%d;", getPlayerid()); MySQL::insert(sql); for(int i=0; igetItemNum(); i++){ sprintf_s(sql, 2000, "insert into items values(%d, %d, %d, %d, %d);", inv->getItem(i)->id, getPlayerid() ,inv->getItem(i)->inv, inv->getItem(i)->pos, inv->getItem(i)->amount); MySQL::insert(sql); } Skills::stopTimerPlayer(this); isconnect = false; } } void Player::handleRequest(unsigned char* buf, int len){ short header = buf[0] + buf[1]*0x100; //printf("%x\n",header); //print out headers? switch(header){ case 0x14: getUserID(buf+2); break; case 0x2F: Maps::moveMap(this ,buf+2); break; case 0x35: Players::handleMoving(this ,buf+2, len-2); break; case 0x2B: Inventory::stopChair(this ,buf+2); break; case 0x2D: Inventory::useChair(this ,buf+2); break; case 0x59: Mobs::damageMob(this ,buf+2); break; case 0x36: Mobs::damageMobS(this ,buf+2, len-2); break; case 0x2E: Mobs::damageMobSkill(this ,buf+2); break; case 0x2A: Players::damagePlayer(this ,buf+2); break; case 0x5C: Players::faceExperiment(this ,buf+2); break; case 0x2C: Players::chatHandler(this ,buf+2); break; case 0x23: NPCs::handleNPC(this, buf+2); break; case 0x21: NPCs::handleNPCIn(this ,buf+2); break; case 0x22: Inventory::useShop(this ,buf+2); break; case 0x44: Players::getPlayerInfo(this, buf+2); break; case 0x62: Inventory::itemMove(this ,buf+2); break; case 0x63: Inventory::useItem(this, buf+2); break; case 0x66: Levels::addStat(this, buf+2); break; case 0x67: Players::healPlayer(this, buf+2); break; case 0x4D: Skills::addSkill(this, buf+2); break; case 0x51: Skills::useSkill(this, buf+2); break; case 0x4E: Skills::cancelSkill(this, buf+2); break; case 0x68: Drops::dropMesos(this ,buf+2); break; case 0x6B: Quests::getQuest(this, buf+2); break; case 0x75: chaneKey(buf+2); case 0x9D: Mobs::monsterControl(this ,buf+2, len-2); break; case 0xA0: Mobs::monsterControlSkill(this ,buf+2); break; case 0x89: Drops::lootItem(this ,buf+2); break; } } void Player::playerConnect(){ MySQL::getStringI("characters", "ID", getPlayerid(), "name", name); gender = (char)MySQL::getInt("characters", getPlayerid(), "gender"); skin = (char)MySQL::getInt("characters", getPlayerid(), "skin"); eyes = MySQL::getInt("characters", getPlayerid(), "eyes"); hair = MySQL::getInt("characters", getPlayerid(), "hair"); level = (char)MySQL::getInt("characters", getPlayerid(), "level"); job = (short)MySQL::getInt("characters", getPlayerid(), "job"); str = (short)MySQL::getInt("characters", getPlayerid(), "str"); dex = (short)MySQL::getInt("characters", getPlayerid(), "dex"); intt = (short)MySQL::getInt("characters", getPlayerid(), "intt"); luk = (short)MySQL::getInt("characters", getPlayerid(), "luk"); hp = (short)MySQL::getInt("characters", getPlayerid(), "chp"); mhp = (short)MySQL::getInt("characters", getPlayerid(), "mhp"); mp = (short)MySQL::getInt("characters", getPlayerid(), "cmp"); mmp = (short)MySQL::getInt("characters", getPlayerid(), "mmp"); ap = (short)MySQL::getInt("characters", getPlayerid(), "ap"); sp = (short)MySQL::getInt("characters", getPlayerid(), "sp"); exp = MySQL::getInt("characters", getPlayerid(), "exp"); fame = (short)MySQL::getInt("characters", getPlayerid(), "fame"); map = MySQL::getInt("characters", getPlayerid(), "map"); mappos = (char)MySQL::getInt("characters", getPlayerid(), "pos"); gm = MySQL::getInt("users", MySQL::getInt("characters", getPlayerid(), "userid"), "gm"); userid = MySQL::getInt("characters", getPlayerid(), "userid"); int equips[115][21]; int many = MySQL::showEquipsIn(getPlayerid(), equips); inv = new PlayerInventory(); skills = new PlayerSkills(); quests = new PlayerQuests(); quests->setPlayer(this); for(int i=0; iid = equips[i][0]; equip->slots = equips[i][4]; equip->scrolls = equips[i][5]; equip->type = equips[i][1]; equip->pos = equips[i][3]; equip->istr = equips[i][6]; equip->idex = equips[i][7]; equip->iint = equips[i][8]; equip->iluk = equips[i][9]; equip->ihp = equips[i][10]; equip->imp = equips[i][11]; equip->iwatk = equips[i][12]; equip->imatk = equips[i][13]; equip->iwdef = equips[i][14]; equip->imdef = equips[i][15]; equip->iacc = equips[i][16]; equip->iavo = equips[i][17]; equip->ihand = equips[i][18]; equip->ijump = equips[i][19]; equip->ispeed = equips[i][20]; inv->addEquip(equip); } int items[400][4]; many = MySQL::getItems(getPlayerid(), items); for(int i=0; iid = items[i][0]; item->inv = items[i][1]; item->pos = items[i][2]; item->amount = items[i][3]; inv->addItem(item); } int skill[200][2]; many = MySQL::getSkills(getPlayerid(), skill); for(int i=0; iaddSkillLevel(skill[i][0], skill[i][1]); } inv->setMesosStart(MySQL::getInt("characters", getPlayerid(), "mesos")); inv->setPlayer(this); MySQL::getKeys(getPlayerid(), keys); PlayerPacket::connectData(this); Server::showScrollingHeader(this); if(Maps::info[map].Portals.size() > 0){ pos.x = Maps::info[map].Portals[0].x; pos.y = Maps::info[map].Portals[0].y; } else{ pos.x = 0; pos.y = 0; } type=0; PlayerPacket::showKeys(this, keys); Maps::newMap(this); /* added by MooMoo! */ char chrSignOn[35] = ""; strcat_s(chrSignOn, 35, "'"); strcat_s(chrSignOn,35,this->getName()); strcat_s(chrSignOn, 35, "' has logged on! :)"); PlayersPacket::showMassage(chrSignOn,6); /* End Added by MooMoo */ } void Player::setHP(int hp, bool is){ if(hp<0) this->hp=0; else if(hp>mhp) this->hp=mhp; else this->hp=hp; if(is) PlayerPacket::newHP(this, (short)this->hp); } void Player::setMP(int mp, bool is){ if(mp<0) this->mp=0; else if(mp>mmp) this->mp=mmp; else this->mp=mp; PlayerPacket::newMP(this, (short)this->mp, is); } void Player::setSp(short sp){ this->sp=sp; PlayerPacket::setSP(this); } void Player::setJob(short job){ this->job=job; PlayerPacket::setJob(this); } void Player::setExp(int exp, bool is){ this->exp=exp; if(is) PlayerPacket::newEXP(this, this->exp); } void Player::setLevel(int level){ this->level=(unsigned char)level; } int getIntg(unsigned char* buf){ return buf[0] + buf[1]*0x100 + buf[2]*0x100*0x100 + buf[3]*0x100*0x100*0x100; } void Player::chaneKey(unsigned char* packet){ int howmany = getIntg(packet+4); for(int i=0; i=0 && pos<90) keys[pos] = key; } } void Player::setHair(int id){ this->hair = id; PlayerPacket::newHair(this); } void Player::setEyes(int id){ this->eyes = id; PlayerPacket::newEyes(this); } void Player::setSkin(char id){ this->skin = id; PlayerPacket::newSkin(this); }