Guest User

Untitled

a guest
Jul 23rd, 2010
138
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 14.21 KB | None | 0 0
  1.  
  2. /* $Id: Item.cpp 186 2010-02-06 00:06:47Z sausage $
  3. * EOSERV is released under the zlib license.
  4. * See LICENSE.txt for more info.
  5. */
  6.  
  7. #include "handlers.h"
  8.  
  9. #include "eodata.hpp"
  10. #include "map.hpp"
  11. #include "party.hpp"
  12.  
  13. CLIENT_F_FUNC(Item)
  14. {
  15. PacketBuilder reply;
  16.  
  17. switch (action)
  18. {
  19. case PACKET_USE: // Player using an item
  20. {
  21. if (this->state < EOClient::PlayingModal) return false;
  22. CLIENT_QUEUE_ACTION(0.0)
  23.  
  24. int id = reader.GetShort();
  25.  
  26. if (this->player->character->HasItem(id))
  27. {
  28. EIF_Data *item = this->server->world->eif->Get(id);
  29. reply.SetID(PACKET_ITEM, PACKET_REPLY);
  30. reply.AddChar(item->type);
  31. reply.AddShort(id);
  32. #include npc.hpp
  33.  
  34.  
  35.  
  36.  
  37. if(id == 45)
  38. {
  39.  
  40.  
  41.  
  42.  
  43. this->player->character->Save(); //this may be unnessasary
  44. this->player->character->AddItem(id, 1);//adds back the item after it's use
  45. this->player->character->Save();
  46.  
  47.  
  48.  
  49.  
  50. if(!this->player->character->has_pet)
  51. {
  52.  
  53.  
  54. unsigned char index = this->player->character->map->GenerateNPCIndex();
  55. if (index > 250)
  56.  
  57.  
  58. {
  59.  
  60.  
  61. break;
  62.  
  63.  
  64. }
  65.  
  66.  
  67. this->player->character->pet = new NPC(this->player->character->map, NpcID, this->player->character->x + 1,this->player->character->y, 1, 1, index, true, true);
  68. this->player->character->pet->Spawn();
  69. this->player->character->pet->SetOwner(this->player->character);
  70. this->player->character->has_pet = true;
  71. //this->player->character->AddItem(682, 1);
  72. this->player->character->map->npcs.push_back(this->player->character->pet);
  73.  
  74.  
  75.  
  76.  
  77. this->player->character->Save();
  78.  
  79.  
  80. }
  81. }
  82.  
  83.  
  84. switch (item->type)
  85. {
  86. case EIF::Teleport:
  87. {
  88. if (this->state < EOClient::Playing)
  89. {
  90. break;
  91. }
  92.  
  93. if (!this->player->character->map->scroll)
  94. {
  95. break;
  96. }
  97.  
  98. this->player->character->DelItem(id, 1);
  99. reply.AddInt(this->player->character->HasItem(id));
  100. reply.AddChar(this->player->character->weight);
  101. reply.AddChar(this->player->character->maxweight);
  102.  
  103. if (item->scrollmap == 0)
  104. {
  105. this->player->character->Warp(this->player->character->SpawnMap(), this->player->character->SpawnX(), this->player->character->SpawnY(), WARP_ANIMATION_SCROLL);
  106. }
  107. else
  108. {
  109. this->player->character->Warp(item->scrollmap, item->scrollx, item->scrolly, WARP_ANIMATION_SCROLL);
  110. }
  111.  
  112. CLIENT_SEND(reply);
  113. }
  114. break;
  115.  
  116. case EIF::Heal:
  117. {
  118. int hpgain = item->hp;
  119. int tpgain = item->tp;
  120.  
  121. if (this->server->world->config["LimitDamage"])
  122. {
  123. hpgain = std::min(hpgain, this->player->character->maxhp - this->player->character->hp);
  124. tpgain = std::min(tpgain, this->player->character->maxtp - this->player->character->tp);
  125. }
  126.  
  127. hpgain = std::max(hpgain, 0);
  128. tpgain = std::max(tpgain, 0);
  129.  
  130. this->player->character->hp += hpgain;
  131. this->player->character->tp += tpgain;
  132.  
  133. if (!this->server->world->config["LimitDamage"])
  134. {
  135. this->player->character->hp = std::min(this->player->character->hp, this->player->character->maxhp);
  136. this->player->character->tp = std::min(this->player->character->tp, this->player->character->maxtp);
  137. }
  138.  
  139. this->player->character->DelItem(id, 1);
  140. reply.AddInt(this->player->character->HasItem(id));
  141. reply.AddChar(this->player->character->weight);
  142. reply.AddChar(this->player->character->maxweight);
  143.  
  144. reply.AddInt(hpgain);
  145. reply.AddShort(this->player->character->hp);
  146. reply.AddShort(this->player->character->tp);
  147.  
  148. PacketBuilder builder(PACKET_RECOVER, PACKET_AGREE);
  149. builder.AddShort(this->player->id);
  150. builder.AddInt(hpgain);
  151. builder.AddChar(int(double(this->player->character->hp) / double(this->player->character->maxhp) * 100.0));
  152.  
  153. UTIL_PTR_LIST_FOREACH(this->player->character->map->characters, Character, character)
  154. {
  155. if (*character != this->player->character && this->player->character->InRange(*character))
  156. {
  157. character->player->client->SendBuilder(builder);
  158. }
  159. }
  160.  
  161. if (this->player->character->party)
  162. {
  163. this->player->character->party->UpdateHP(this->player->character);
  164. }
  165.  
  166. CLIENT_SEND(reply);
  167. }
  168. break;
  169.  
  170. case EIF::HairDye:
  171. {
  172. this->player->character->haircolor = item->haircolor;
  173.  
  174. this->player->character->DelItem(id, 1);
  175. reply.AddInt(this->player->character->HasItem(id));
  176. reply.AddChar(this->player->character->weight);
  177. reply.AddChar(this->player->character->maxweight);
  178.  
  179. reply.AddChar(item->haircolor);
  180.  
  181. PacketBuilder builder(PACKET_CLOTHES, PACKET_AGREE);
  182. builder.AddShort(this->player->id);
  183. builder.AddChar(SLOT_HAIRCOLOR);
  184. builder.AddChar(0); // subloc
  185. builder.AddChar(item->haircolor);
  186.  
  187. UTIL_PTR_LIST_FOREACH(this->player->character->map->characters, Character, character)
  188. {
  189. if (*character != this->player->character && this->player->character->InRange(*character))
  190. {
  191. character->player->client->SendBuilder(builder);
  192. }
  193. }
  194.  
  195. CLIENT_SEND(reply);
  196. }
  197. break;
  198.  
  199. case EIF::Beer:
  200. {
  201. this->player->character->DelItem(id, 1);
  202. reply.AddInt(this->player->character->HasItem(id));
  203. reply.AddChar(this->player->character->weight);
  204. reply.AddChar(this->player->character->maxweight);
  205.  
  206. CLIENT_SEND(reply);
  207. }
  208. break;
  209.  
  210. case EIF::EffectPotion:
  211. {
  212. this->player->character->DelItem(id, 1);
  213. reply.AddInt(this->player->character->HasItem(id));
  214. reply.AddChar(this->player->character->weight);
  215. reply.AddChar(this->player->character->maxweight);
  216. reply.AddShort(item->effect);
  217.  
  218. this->player->character->Effect(item->effect, false);
  219.  
  220. CLIENT_SEND(reply);
  221. }
  222. break;
  223.  
  224. case EIF::CureCurse:
  225. {
  226. for (std::size_t i = 0; i < this->player->character->paperdoll.size(); ++i)
  227. {
  228. if (this->server->world->eif->Get(this->player->character->paperdoll[i])->special == EIF::Cursed)
  229. {
  230. this->player->character->paperdoll[i] = 0;
  231. }
  232. }
  233.  
  234. this->player->character->CalculateStats();
  235.  
  236. this->player->character->DelItem(id, 1);
  237. reply.AddInt(this->player->character->HasItem(id));
  238. reply.AddChar(this->player->character->weight);
  239. reply.AddChar(this->player->character->maxweight);
  240.  
  241. reply.AddShort(this->player->character->maxhp);
  242. reply.AddShort(this->player->character->maxtp);
  243. reply.AddShort(this->player->character->str);
  244. reply.AddShort(this->player->character->intl);
  245. reply.AddShort(this->player->character->wis);
  246. reply.AddShort(this->player->character->agi);
  247. reply.AddShort(this->player->character->con);
  248. reply.AddShort(this->player->character->cha);
  249. reply.AddShort(this->player->character->mindam);
  250. reply.AddShort(this->player->character->maxdam);
  251. reply.AddShort(this->player->character->accuracy);
  252. reply.AddShort(this->player->character->evade);
  253. reply.AddShort(this->player->character->armor);
  254.  
  255. PacketBuilder builder;
  256. builder.SetID(PACKET_CLOTHES, PACKET_AGREE);
  257. builder.AddShort(this->player->id);
  258. builder.AddChar(SLOT_CLOTHES);
  259. builder.AddChar(0);
  260. builder.AddShort(this->server->world->eif->Get(this->player->character->paperdoll[Character::Boots])->dollgraphic);
  261. builder.AddShort(this->server->world->eif->Get(this->player->character->paperdoll[Character::Armor])->dollgraphic);
  262. builder.AddShort(this->server->world->eif->Get(this->player->character->paperdoll[Character::Hat])->dollgraphic);
  263. builder.AddShort(this->server->world->eif->Get(this->player->character->paperdoll[Character::Weapon])->dollgraphic);
  264. builder.AddShort(this->server->world->eif->Get(this->player->character->paperdoll[Character::Shield])->dollgraphic);
  265.  
  266. UTIL_PTR_LIST_FOREACH(this->player->character->map->characters, Character, character)
  267. {
  268. if (*character != this->player->character && this->player->character->InRange(*character))
  269. {
  270. character->player->client->SendBuilder(builder);
  271. }
  272. }
  273.  
  274. CLIENT_SEND(reply);
  275. }
  276. break;
  277.  
  278. case EIF::EXPReward:
  279. {
  280. bool level_up = false;
  281.  
  282. this->player->character->exp += item->expreward;
  283.  
  284. this->player->character->exp = std::min(this->player->character->exp, static_cast<int>(this->player->character->map->world->config["MaxExp"]));
  285.  
  286. while (this->player->character->level < static_cast<int>(this->player->character->map->world->config["MaxLevel"])
  287. && this->player->character->exp >= this->player->character->map->world->exp_table[this->player->character->level+1])
  288. {
  289. level_up = true;
  290. ++this->player->character->level;
  291. this->player->character->statpoints += static_cast<int>(this->player->character->map->world->config["StatPerLevel"]);
  292. this->player->character->skillpoints += static_cast<int>(this->player->character->map->world->config["SkillPerLevel"]);
  293. this->player->character->CalculateStats();
  294. }
  295.  
  296. this->player->character->DelItem(id, 1);
  297. reply.AddInt(this->player->character->HasItem(id));
  298. reply.AddChar(this->player->character->weight);
  299. reply.AddChar(this->player->character->maxweight);
  300.  
  301. reply.AddInt(this->player->character->exp);
  302.  
  303. reply.AddChar(level_up ? this->player->character->level : 0);
  304. reply.AddShort(this->player->character->statpoints);
  305. reply.AddShort(this->player->character->skillpoints);
  306. reply.AddShort(this->player->character->maxhp);
  307. reply.AddShort(this->player->character->maxtp);
  308. reply.AddShort(this->player->character->maxsp);
  309.  
  310. if (level_up)
  311. {
  312. // TODO: Something better than this
  313. this->player->character->Emote(EMOTE_LEVELUP, false);
  314. }
  315.  
  316. CLIENT_SEND(reply);
  317. }
  318. break;
  319.  
  320. default:
  321. return true;
  322. }
  323. }
  324. }
  325. break;
  326.  
  327. case PACKET_DROP: // Drop an item on the ground
  328. {
  329. if (this->state < EOClient::PlayingModal) return false;
  330. CLIENT_QUEUE_ACTION(0.0)
  331.  
  332. int id = reader.GetShort();
  333. int amount;
  334.  
  335. if (this->server->world->eif->Get(id)->special == EIF::Lore)
  336. {
  337. return true;
  338. }
  339.  
  340. if (reader.Length() == 8)
  341. {
  342. amount = reader.GetThree();
  343. }
  344. else
  345. {
  346. amount = reader.GetInt();
  347. }
  348. unsigned char x = reader.GetByte(); // ?
  349. unsigned char y = reader.GetByte(); // ?
  350.  
  351. amount = std::min<int>(amount, this->server->world->config["MaxDrop"]);
  352.  
  353. if (amount == 0)
  354. {
  355. return true;
  356. }
  357.  
  358. if (x == 255 && y == 255)
  359. {
  360. x = this->player->character->x;
  361. y = this->player->character->y;
  362. }
  363. else
  364. {
  365. if (this->state < EOClient::Playing) return false;
  366. x = PacketProcessor::Number(x);
  367. y = PacketProcessor::Number(y);
  368. }
  369.  
  370. int distance = util::path_length(x, y, this->player->character->x, this->player->character->y);
  371.  
  372. if (distance > static_cast<int>(this->server->world->config["DropDistance"]))
  373. {
  374. return true;
  375. }
  376.  
  377. if (!this->player->character->map->Walkable(x, y))
  378. {
  379. return true;
  380. }
  381.  
  382. if (this->player->character->HasItem(id) >= amount && this->player->character->mapid != static_cast<int>(this->server->world->config["JailMap"]))
  383. {
  384. Map_Item *item = this->player->character->map->AddItem(id, amount, x, y, this->player->character);
  385. if (item)
  386. {
  387. item->owner = this->player->id;
  388. item->unprotecttime = Timer::GetTime() + static_cast<double>(this->server->world->config["ProtectPlayerDrop"]);
  389. this->player->character->DelItem(id, amount);
  390.  
  391. reply.SetID(PACKET_ITEM, PACKET_DROP);
  392. reply.AddShort(id);
  393. reply.AddThree(amount);
  394. reply.AddInt(this->player->character->HasItem(id));
  395. reply.AddShort(item->uid);
  396. reply.AddChar(x);
  397. reply.AddChar(y);
  398. reply.AddChar(this->player->character->weight);
  399. reply.AddChar(this->player->character->maxweight);
  400. CLIENT_SEND(reply);
  401. }
  402. }
  403. }
  404. break;
  405.  
  406. case PACKET_JUNK: // Destroying an item
  407. {
  408. if (this->state < EOClient::PlayingModal) return false;
  409.  
  410. int id = reader.GetShort();
  411. int amount = reader.GetInt();
  412.  
  413. if (this->player->character->HasItem(id) >= amount)
  414. {
  415. this->player->character->DelItem(id, amount);
  416.  
  417. reply.SetID(PACKET_ITEM, PACKET_JUNK);
  418. reply.AddShort(id);
  419. reply.AddThree(amount); // Overflows, does it matter?
  420. reply.AddInt(this->player->character->HasItem(id));
  421. reply.AddChar(this->player->character->weight);
  422. reply.AddChar(this->player->character->maxweight);
  423. CLIENT_SEND(reply);
  424. }
  425. }
  426. break;
  427.  
  428. case PACKET_GET: // Retrieve an item from the ground
  429. {
  430. if (this->state < EOClient::Playing) return false;
  431. CLIENT_QUEUE_ACTION(0.0)
  432.  
  433. int uid = reader.GetShort();
  434.  
  435. Map_Item *item = this->player->character->map->GetItem(uid);
  436. if (item)
  437. {
  438. int distance = util::path_length(item->x, item->y, this->player->character->x, this->player->character->y);
  439.  
  440. if (distance > static_cast<int>(this->server->world->config["DropDistance"]))
  441. {
  442. break;
  443. }
  444.  
  445. if (item->owner != this->player->id && item->unprotecttime > Timer::GetTime())
  446. {
  447. break;
  448. }
  449.  
  450. this->player->character->AddItem(item->id, item->amount);
  451.  
  452. reply.SetID(PACKET_ITEM, PACKET_GET);
  453. reply.AddShort(uid);
  454. reply.AddShort(item->id);
  455. reply.AddThree(item->amount);
  456. reply.AddChar(this->player->character->weight);
  457. reply.AddChar(this->player->character->maxweight);
  458. CLIENT_SEND(reply);
  459.  
  460. this->player->character->map->DelItem(item, this->player->character);
  461.  
  462. break;
  463. }
  464.  
  465. }
  466. break;
  467.  
  468. default:
  469. return false;
  470. }
  471.  
  472. return true;
  473. }
Advertisement
Add Comment
Please, Sign In to add comment