Changeset 171
- Timestamp:
- 12/15/09 16:06:58 (9 months ago)
- Location:
- eoserv/trunk
- Files:
-
- 11 added
- 3 removed
- 71 modified
-
Makefile.all (modified) (3 diffs)
-
admin.ini (modified) (1 diff)
-
config.ini (modified) (1 diff)
-
project/mingw.cbp (modified) (7 diffs)
-
src/arena.cpp (modified) (8 diffs)
-
src/arena.hpp (modified) (4 diffs)
-
src/character.cpp (modified) (30 diffs)
-
src/character.hpp (modified) (10 diffs)
-
src/config.hpp (modified) (1 diff)
-
src/console.cpp (modified) (1 diff)
-
src/console.hpp (modified) (2 diffs)
-
src/container (added)
-
src/container/algorithm.hpp (added)
-
src/container/container.hpp (added)
-
src/container/iterator.hpp (added)
-
src/container/ptr_list.cpp (added)
-
src/container/ptr_list.hpp (added)
-
src/container/ptr_vector.cpp (added)
-
src/container/ptr_vector.hpp (added)
-
src/database.cpp (modified) (8 diffs)
-
src/database.hpp (modified) (1 diff)
-
src/eoclient.cpp (modified) (2 diffs)
-
src/eoclient.hpp (modified) (3 diffs)
-
src/eoconst.hpp (modified) (1 diff)
-
src/eodata.cpp (modified) (11 diffs)
-
src/eodata.hpp (modified) (12 diffs)
-
src/eoserver.cpp (modified) (4 diffs)
-
src/eoserver.hpp (modified) (4 diffs)
-
src/fwd/console.hpp (added)
-
src/fwd/hook.hpp (deleted)
-
src/fwd/script.hpp (deleted)
-
src/fwd/socket.hpp (modified) (1 diff)
-
src/fwd/timer.hpp (modified) (1 diff)
-
src/guild.hpp (modified) (1 diff)
-
src/handlers/Account.cpp (modified) (4 diffs)
-
src/handlers/Bank.cpp (modified) (1 diff)
-
src/handlers/Board.cpp (modified) (3 diffs)
-
src/handlers/Chair.cpp (modified) (1 diff)
-
src/handlers/Character.cpp (modified) (5 diffs)
-
src/handlers/Chest.cpp (modified) (5 diffs)
-
src/handlers/Init.cpp (modified) (1 diff)
-
src/handlers/Internal.cpp (modified) (1 diff)
-
src/handlers/Item.cpp (modified) (4 diffs)
-
src/handlers/Locker.cpp (modified) (8 diffs)
-
src/handlers/Login.cpp (modified) (4 diffs)
-
src/handlers/Paperdoll.cpp (modified) (3 diffs)
-
src/handlers/Party.cpp (modified) (6 diffs)
-
src/handlers/Players.cpp (modified) (1 diff)
-
src/handlers/Shop.cpp (modified) (6 diffs)
-
src/handlers/Talk.cpp (modified) (7 diffs)
-
src/handlers/Trade.cpp (modified) (5 diffs)
-
src/handlers/Walk.cpp (modified) (1 diff)
-
src/handlers/Warp.cpp (modified) (5 diffs)
-
src/handlers/Welcome.cpp (modified) (7 diffs)
-
src/hook.cpp (modified) (2 diffs)
-
src/hook.hpp (modified) (3 diffs)
-
src/main.cpp (modified) (11 diffs)
-
src/map.cpp (modified) (65 diffs)
-
src/map.hpp (modified) (15 diffs)
-
src/nanohttp.cpp (modified) (2 diffs)
-
src/nanohttp.hpp (modified) (1 diff)
-
src/npc.cpp (modified) (25 diffs)
-
src/npc.hpp (modified) (9 diffs)
-
src/party.cpp (modified) (10 diffs)
-
src/party.hpp (modified) (3 diffs)
-
src/player.cpp (modified) (5 diffs)
-
src/player.hpp (modified) (3 diffs)
-
src/script.cpp (modified) (5 diffs)
-
src/script.hpp (modified) (7 diffs)
-
src/scriptlibc.cpp (modified) (2 diffs)
-
src/scriptreg.cpp (modified) (1 diff)
-
src/scriptstl.h (deleted)
-
src/shared.cpp (added)
-
src/shared.hpp (added)
-
src/sln.cpp (modified) (5 diffs)
-
src/sln.hpp (modified) (1 diff)
-
src/socket.cpp (modified) (4 diffs)
-
src/socket.hpp (modified) (14 diffs)
-
src/stdafx.h (modified) (3 diffs)
-
src/timer.cpp (modified) (2 diffs)
-
src/timer.hpp (modified) (4 diffs)
-
src/util.cpp (modified) (3 diffs)
-
src/util.hpp (modified) (2 diffs)
-
src/world.cpp (modified) (17 diffs)
-
src/world.hpp (modified) (5 diffs)
Legend:
- Unmodified
- Added
- Removed
-
eoserv/trunk/Makefile.all
r168 r171 49 49 $(OBJDIR)/script.o \ 50 50 $(OBJDIR)/scriptlibc.o \ 51 $(OBJDIR)/scriptreg.o \ 51 52 $(OBJDIR)/sha256.o \ 53 $(OBJDIR)/shared.o \ 52 54 $(OBJDIR)/sln.o \ 53 55 $(OBJDIR)/socket.o \ … … 55 57 $(OBJDIR)/util.o \ 56 58 $(OBJDIR)/world.o \ 59 $(OBJDIR)/container/ptr_list.o \ 60 $(OBJDIR)/container/ptr_vector.o \ 57 61 $(OBJDIR)/handlers/Account.o \ 58 62 $(OBJDIR)/handlers/AdminInteract.o \ … … 119 123 create-build-dirs: 120 124 -@mkdir $(OBJDIR) 125 -@mkdir $(OBJDIR)/container 121 126 -@mkdir $(OBJDIR)/extra 122 127 -@mkdir $(OBJDIR)/handlers 123 128 124 129 $(OBJDIR)/%.o: $(SRCDIR)/%.c 125 $(CC) -I./$(SRCDIR)/ -I./$(SRCDIR)/ extra/ -I./$(SRCDIR)/handlers/ -c $< -o $@ $(CFLAGS)130 $(CC) -I./$(SRCDIR)/ -I./$(SRCDIR)/container/ -I./$(SRCDIR)/extra/ -I./$(SRCDIR)/handlers/ -c $< -o $@ $(CFLAGS) 126 131 127 132 $(OBJDIR)/%.o: $(SRCDIR)/%.cpp 128 $(CXX) -I./$(SRCDIR)/ -I./$(SRCDIR)/ extra/ -I./$(SRCDIR)/handlers/ -c $< -o $@ $(CXXFLAGS)133 $(CXX) -I./$(SRCDIR)/ -I./$(SRCDIR)/container/ -I./$(SRCDIR)/extra/ -I./$(SRCDIR)/handlers/ -c $< -o $@ $(CXXFLAGS) 129 134 130 135 eoserv: create-build-dirs $(OBJ) -
eoserv/trunk/admin.ini
r157 r171 30 30 # $info character 31 31 info = 1 32 33 # Shows the server uptime 34 # $uptime 35 uptime = 1 36 37 # Shows the number of allocated shared objects 38 # $objects 39 objects = 4 32 40 33 41 -
eoserv/trunk/config.ini
r169 r171 363 363 # Protect drops from players 364 364 # Shouldn't be lowered unless using a custom client which supports it 365 Pro ctectPlayerDrop = 5s365 ProtectPlayerDrop = 5s 366 366 367 367 ## ProtectNPCDrop (number) -
eoserv/trunk/project/mingw.cbp
r168 r171 16 16 <Compiler> 17 17 <Add option="-g" /> 18 <Add option="-D_GLIBCXX_DEBUG" /> 19 <Add option="-D_GLIBCXX_DEBUG_PEDANTIC" /> 18 20 <Add option="-DDEBUG" /> 19 21 <Add option="-DDATABASE_DEBUG" /> … … 114 116 <Add directory="..\src\extra\" /> 115 117 <Add directory="..\src\handlers\" /> 118 <Add directory="..\src\container\" /> 116 119 </Compiler> 117 120 <Linker> … … 135 138 <Unit filename="..\src\console.cpp" /> 136 139 <Unit filename="..\src\console.hpp" /> 140 <Unit filename="..\src\container\algorithm.hpp" /> 141 <Unit filename="..\src\container\container.hpp" /> 142 <Unit filename="..\src\container\iterator.hpp" /> 143 <Unit filename="..\src\container\ptr_list.cpp" /> 144 <Unit filename="..\src\container\ptr_list.hpp" /> 145 <Unit filename="..\src\container\ptr_vector.cpp" /> 146 <Unit filename="..\src\container\ptr_vector.hpp" /> 137 147 <Unit filename="..\src\database.cpp" /> 138 148 <Unit filename="..\src\database.hpp" /> … … 149 159 <Unit filename="..\src\fwd\character.hpp" /> 150 160 <Unit filename="..\src\fwd\config.hpp" /> 161 <Unit filename="..\src\fwd\console.hpp" /> 151 162 <Unit filename="..\src\fwd\database.hpp" /> 152 163 <Unit filename="..\src\fwd\eoclient.hpp" /> … … 154 165 <Unit filename="..\src\fwd\eoserver.hpp" /> 155 166 <Unit filename="..\src\fwd\guild.hpp" /> 156 <Unit filename="..\src\fwd\hook.hpp" />157 167 <Unit filename="..\src\fwd\map.hpp" /> 158 168 <Unit filename="..\src\fwd\nanohttp.hpp" /> … … 161 171 <Unit filename="..\src\fwd\party.hpp" /> 162 172 <Unit filename="..\src\fwd\player.hpp" /> 163 <Unit filename="..\src\fwd\script.hpp" />164 173 <Unit filename="..\src\fwd\sln.hpp" /> 165 174 <Unit filename="..\src\fwd\socket.hpp" /> … … 230 239 <Unit filename="..\src\scriptreg.cpp" /> 231 240 <Unit filename="..\src\scriptreg.hpp" /> 232 <Unit filename="..\src\scriptstl.h" />233 241 <Unit filename="..\src\sha256.c"> 234 242 <Option compilerVar="CC" /> 235 243 </Unit> 236 244 <Unit filename="..\src\sha256.h" /> 245 <Unit filename="..\src\shared.cpp" /> 246 <Unit filename="..\src\shared.hpp" /> 237 247 <Unit filename="..\src\sln.cpp" /> 238 248 <Unit filename="..\src\sln.hpp" /> -
eoserv/trunk/src/arena.cpp
r168 r171 37 37 int newplayers = 0; 38 38 39 UTIL_ VECTOR_FOREACH_ALL(this->spawns, Arena_Spawn, spawn)39 UTIL_PTR_VECTOR_FOREACH(this->spawns, Arena_Spawn, spawn) 40 40 { 41 UTIL_ LIST_FOREACH_ALL(this->map->characters, Character *, character)41 UTIL_PTR_LIST_FOREACH(this->map->characters, Character, character) 42 42 { 43 if (character->x == spawn .sx && character->y == spawn.sy)43 if (character->x == spawn->sx && character->y == spawn->sy) 44 44 { 45 45 ++newplayers; … … 57 57 PacketBuilder builder(PACKET_ARENA, PACKET_DROP); 58 58 59 UTIL_ LIST_FOREACH_ALL(this->map->characters, Character *, character)59 UTIL_PTR_LIST_FOREACH(this->map->characters, Character, character) 60 60 { 61 61 character->player->client->SendBuilder(builder); … … 65 65 } 66 66 67 UTIL_ VECTOR_FOREACH_ALL(this->spawns, Arena_Spawn, spawn)67 UTIL_PTR_VECTOR_FOREACH(this->spawns, Arena_Spawn, spawn) 68 68 { 69 UTIL_ LIST_FOREACH_ALL(this->map->characters, Character *, character)69 UTIL_PTR_LIST_FOREACH(this->map->characters, Character, character) 70 70 { 71 if (character->x == spawn .sx && character->y == spawn.sy)71 if (character->x == spawn->sx && character->y == spawn->sy) 72 72 { 73 73 character->next_arena = this; 74 74 character->arena_kills = 0; 75 character->Warp(this->map->id, spawn .dx, spawn.dy);75 character->Warp(this->map->id, spawn->dx, spawn->dy); 76 76 break; 77 77 } … … 82 82 builder.AddChar(newplayers); 83 83 84 UTIL_ LIST_FOREACH_ALL(this->map->characters, Character *, character)84 UTIL_PTR_LIST_FOREACH(this->map->characters, Character, character) 85 85 { 86 86 character->player->client->SendBuilder(builder); … … 112 112 } 113 113 114 UTIL_ LIST_FOREACH_ALL(this->map->characters, Character *, character)114 UTIL_PTR_LIST_FOREACH(this->map->characters, Character, character) 115 115 { 116 if (character->arena == this && character->x == target_x && character->y == target_y) 116 Character *character_ptr = *character; 117 character_ptr->AddRef(); 118 119 if (character_ptr->arena == this && character_ptr->x == target_x && character_ptr->y == target_y) 117 120 { 118 121 ++from->arena_kills; 119 character ->Warp(this->map->id, this->map->relog_x, this->map->relog_y);122 character_ptr->Warp(this->map->id, this->map->relog_x, this->map->relog_y); 120 123 121 124 PacketBuilder builder(PACKET_ARENA, PACKET_SPEC); … … 128 131 builder.AddByte(255); 129 132 builder.AddBreakString(from->name); 130 builder.AddBreakString(character ->name);133 builder.AddBreakString(character_ptr->name); 131 134 132 UTIL_ LIST_FOREACH_ALL(this->map->characters, Character *, character)135 UTIL_PTR_LIST_FOREACH(this->map->characters, Character, character) 133 136 { 134 137 character->player->client->SendBuilder(builder); … … 143 146 builder.AddBreakString(from->name); 144 147 145 UTIL_ LIST_FOREACH_ALL(this->map->characters, Character *, character)148 UTIL_PTR_LIST_FOREACH(this->map->characters, Character, character) 146 149 { 147 150 character->player->client->SendBuilder(builder); … … 149 152 } 150 153 154 character_ptr->Release(); 151 155 break; 152 156 } 157 158 character_ptr->Release(); 153 159 } 154 160 } -
eoserv/trunk/src/arena.hpp
r168 r171 10 10 #include "stdafx.h" 11 11 12 struct Arena_Spawn 12 struct Arena_Spawn : public Shared 13 13 { 14 14 unsigned char sx; … … 16 16 unsigned char dx; 17 17 unsigned char dy; 18 19 SCRIPT_REGISTER_REF_DF(Arena_Spawn) 20 SCRIPT_REGISTER_VARIABLE("uint8", "sx", sx); 21 SCRIPT_REGISTER_VARIABLE("uint8", "sy", sy); 22 SCRIPT_REGISTER_VARIABLE("uint8", "dx", dx); 23 SCRIPT_REGISTER_VARIABLE("uint8", "dy", sy); 24 SCRIPT_REGISTER_END() 18 25 }; 19 26 20 class Arena 27 class Arena : public Shared 21 28 { 22 29 public: … … 27 34 Timer *spawn_timer; 28 35 Map *map; 29 std::vector<Arena_Spawn> spawns;36 PtrVector<Arena_Spawn> spawns; 30 37 31 38 Arena(Map *map, int time, int block); … … 34 41 35 42 void Attack(Character *from, Direction); 43 44 SCRIPT_REGISTER_REF(Arena) 45 SCRIPT_REGISTER_VARIABLE("int", "occupants", occupants); 46 SCRIPT_REGISTER_VARIABLE("int", "time", time); 47 SCRIPT_REGISTER_VARIABLE("int", "block", block); 48 SCRIPT_REGISTER_VARIABLE("Timer @", "spawn_timer", block); 49 SCRIPT_REGISTER_VARIABLE("Map @", "map", map); 50 SCRIPT_REGISTER_VARIABLE("PtrVector<Arena_Spawn>", "spawns", spawns); 51 SCRIPT_REGISTER_FUNCTION("void Spawn(bool force)", Spawn); 52 SCRIPT_REGISTER_FUNCTION("void Attack(Character @from, Direction)", Spawn); 53 SCRIPT_REGISTER_END() 36 54 }; 37 55 -
eoserv/trunk/src/character.cpp
r168 r171 20 20 21 21 // TODO: Clean up these functions 22 std::string ItemSerialize( std::list<Character_Item>list)22 std::string ItemSerialize(const PtrList<Character_Item> &list) 23 23 { 24 24 std::string serialized; 25 serialized.reserve(list.size()*10); // Reserve some space to stop some mass-reallocations 26 27 UTIL_LIST_FOREACH_ALL(list, Character_Item, item) 28 { 29 serialized.append(util::to_string(item.id)); 25 26 for (PtrList<Character_Item>::ConstIterator it(list); it; ++it) 27 { 28 serialized.append(util::to_string(it->id)); 30 29 serialized.append(","); 31 serialized.append(util::to_string(it em.amount));30 serialized.append(util::to_string(it->amount)); 32 31 serialized.append(";"); 33 32 } 34 33 35 serialized.reserve(0); // Clean up the reserve to save memory36 34 return serialized; 37 35 } 38 36 39 std::list<Character_Item> ItemUnserialize(std::string serialized)40 { 41 std::list<Character_Item> list;37 PtrList<Character_Item> ItemUnserialize(std::string serialized) 38 { 39 PtrList<Character_Item> list; 42 40 std::size_t p = 0; 43 41 std::size_t lastp = std::numeric_limits<std::size_t>::max(); 44 Character_Item newitem;45 42 46 43 if (!serialized.empty() && *(serialized.end()-1) != ';') … … 54 51 std::size_t pp = 0; 55 52 pp = part.find_first_of(',', 0); 53 56 54 if (pp == std::string::npos) 57 55 { 58 56 continue; 59 57 } 60 newitem.id = util::to_int(part.substr(0, pp)); 61 newitem.amount = util::to_int(part.substr(pp+1)); 58 59 Character_Item *newitem = new Character_Item; 60 newitem->id = util::to_int(part.substr(0, pp)); 61 newitem->amount = util::to_int(part.substr(pp+1)); 62 62 63 63 list.push_back(newitem); 64 newitem->Release(); 64 65 65 66 lastp = p; … … 72 73 { 73 74 std::string serialized; 74 75 serialized.reserve(15*5); // Reserve some space to stop some mass-reallocations76 75 77 76 UTIL_ARRAY_FOREACH_ALL(list, int, 15, item) … … 80 79 serialized.append(","); 81 80 } 82 83 serialized.reserve(0); // Clean up the reserve to save memory84 81 85 82 return serialized; … … 252 249 } 253 250 251 void Character::ServerMsg(std::string message) 252 { 253 PacketBuilder builder; 254 255 builder.SetID(PACKET_TALK, PACKET_SERVER); 256 builder.AddString(message); 257 this->player->client->SendBuilder(builder); 258 } 259 254 260 bool Character::Walk(Direction direction) 255 261 { … … 284 290 int Character::HasItem(short item) 285 291 { 286 UTIL_ LIST_FOREACH_ALL(this->inventory, Character_Item, it)287 { 288 if (it .id == item)292 UTIL_PTR_LIST_FOREACH(this->inventory, Character_Item, it) 293 { 294 if (it->id == item) 289 295 { 290 296 if (this->trading) 291 297 { 292 UTIL_ LIST_FOREACH_ALL(this->trade_inventory, Character_Item, tit)298 UTIL_PTR_LIST_FOREACH(this->trade_inventory, Character_Item, tit) 293 299 { 294 if (tit .id == item)300 if (tit->id == item) 295 301 { 296 return std::max(it .amount - tit.amount, 0);302 return std::max(it->amount - tit->amount, 0); 297 303 } 298 304 } 299 305 300 return it .amount;306 return it->amount; 301 307 } 302 308 else 303 309 { 304 return it .amount;310 return it->amount; 305 311 } 306 312 } … … 312 318 bool Character::AddItem(short item, int amount) 313 319 { 314 Character_Item newitem;315 316 320 if (amount <= 0) 317 321 { … … 324 328 } 325 329 326 UTIL_ LIST_IFOREACH_ALL(this->inventory, Character_Item, it)330 UTIL_PTR_LIST_FOREACH(this->inventory, Character_Item, it) 327 331 { 328 332 if (it->id == item) … … 341 345 } 342 346 343 newitem.id = item; 344 newitem.amount = amount; 347 Character_Item *newitem = new Character_Item; 348 newitem->id = item; 349 newitem->amount = amount; 345 350 346 351 this->inventory.push_back(newitem); 352 newitem->Release(); 347 353 this->CalculateStats(); 348 354 return true; … … 356 362 } 357 363 358 UTIL_ LIST_IFOREACH_ALL(this->inventory, Character_Item, it)364 UTIL_PTR_LIST_FOREACH(this->inventory, Character_Item, it) 359 365 { 360 366 if (it->id == item) … … 377 383 } 378 384 385 void Character::DelItem(PtrList<Character_Item>::Iterator &it, int amount) 386 { 387 if (amount <= 0) 388 { 389 return; 390 } 391 392 if (it->amount < 0 || it->amount - amount <= 0) 393 { 394 this->inventory.erase(it); 395 } 396 else 397 { 398 it->amount -= amount; 399 } 400 401 this->CalculateStats(); 402 } 403 379 404 bool Character::AddTradeItem(short item, int amount) 380 405 { 381 Character_Item newitem;382 383 406 if (amount <= 0) 384 407 { … … 398 421 } 399 422 400 UTIL_ LIST_IFOREACH_ALL(this->trade_inventory, Character_Item, it)423 UTIL_PTR_LIST_FOREACH(this->trade_inventory, Character_Item, it) 401 424 { 402 425 if (it->id == item) … … 407 430 } 408 431 409 newitem.id = item; 410 newitem.amount = amount; 432 Character_Item *newitem = new Character_Item; 433 newitem->id = item; 434 newitem->amount = amount; 411 435 412 436 this->trade_inventory.push_back(newitem); 437 newitem->Release(); 413 438 return true; 414 439 } … … 416 441 bool Character::DelTradeItem(short item) 417 442 { 418 UTIL_LIST_IFOREACH_ALL(this->trade_inventory, Character_Item,it)443 for (PtrList<Character_Item>::Iterator it(this->trade_inventory); it; ++it) 419 444 { 420 445 if (it->id == item) … … 426 451 427 452 return false; 453 428 454 } 429 455 … … 441 467 if (((i == Character::Ring2 || i == Character::Armlet2 || i == Character::Bracer2) ? 1 : 0) == subloc) 442 468 { 469 443 470 this->paperdoll[i] = 0; 444 471 this->AddItem(item, 1); … … 646 673 } 647 674 648 bool Character::InRange(Map_Item other)675 bool Character::InRange(Map_Item *other) 649 676 { 650 677 if (this->nowhere) … … 653 680 } 654 681 655 return this->InRange(other .x, other.y);682 return this->InRange(other->x, other->y); 656 683 } 657 684 … … 732 759 PacketBuilder builder; 733 760 734 std::vector<Character *> updatecharacters;735 std::vector<NPC *> updatenpcs;736 std::vector<Map_Item> updateitems;737 738 UTIL_ LIST_FOREACH_ALL(this->map->characters, Character *, character)739 { 740 if (this->InRange( character))741 { 742 updatecharacters.push_back( character);743 } 744 } 745 746 UTIL_ VECTOR_FOREACH_ALL(this->map->npcs, NPC *, npc)747 { 748 if (this->InRange( npc))749 { 750 updatenpcs.push_back( npc);751 } 752 } 753 754 UTIL_ LIST_FOREACH_ALL(this->map->items, Map_Item, item)755 { 756 if (this->InRange( item))757 { 758 updateitems.push_back( item);761 PtrVector<Character> updatecharacters; 762 PtrVector<NPC> updatenpcs; 763 PtrVector<Map_Item> updateitems; 764 765 UTIL_PTR_LIST_FOREACH(this->map->characters, Character, character) 766 { 767 if (this->InRange(*character)) 768 { 769 updatecharacters.push_back(*character); 770 } 771 } 772 773 UTIL_PTR_VECTOR_FOREACH(this->map->npcs, NPC, npc) 774 { 775 if (this->InRange(*npc)) 776 { 777 updatenpcs.push_back(*npc); 778 } 779 } 780 781 UTIL_PTR_LIST_FOREACH(this->map->items, Map_Item, item) 782 { 783 if (this->InRange(*item)) 784 { 785 updateitems.push_back(*item); 759 786 } 760 787 } … … 764 791 builder.AddByte(255); 765 792 766 UTIL_ VECTOR_FOREACH_ALL(updatecharacters, Character *, character)793 UTIL_PTR_VECTOR_FOREACH(updatecharacters, Character, character) 767 794 { 768 795 builder.AddBreakString(character->name); … … 798 825 } 799 826 800 UTIL_ VECTOR_FOREACH_ALL(updatenpcs, NPC *, npc)827 UTIL_PTR_VECTOR_FOREACH(updatenpcs, NPC, npc) 801 828 { 802 829 if (npc->alive) … … 812 839 builder.AddByte(255); 813 840 814 UTIL_ VECTOR_FOREACH_ALL(updateitems, Map_Item, item)815 { 816 builder.AddShort(item .uid);817 builder.AddShort(item .id);818 builder.AddChar(item .x);819 builder.AddChar(item .y);820 builder.AddThree(item .amount);841 UTIL_PTR_VECTOR_FOREACH(updateitems, Map_Item, item) 842 { 843 builder.AddShort(item->uid); 844 builder.AddShort(item->id); 845 builder.AddChar(item->x); 846 builder.AddChar(item->y); 847 builder.AddThree(item->amount); 821 848 } 822 849 … … 838 865 int recent_post_count = 0; 839 866 840 UTIL_ LIST_FOREACH_ALL(this->world->boards[boardid]->posts, Board_Post *, post)867 UTIL_PTR_LIST_FOREACH(this->world->boards[boardid]->posts, Board_Post, post) 841 868 { 842 869 if (post->author == this->player->character->name) … … 853 880 int posts_remaining = std::min(static_cast<int>(this->world->config["BoardMaxUserPosts"]) - post_count, static_cast<int>(this->world->config["BoardMaxUserRecentPosts"]) - recent_post_count); 854 881 855 UTIL_ LIST_FOREACH_ALL(this->world->boards[boardid]->posts, Board_Post *, post)882 UTIL_PTR_LIST_FOREACH(this->world->boards[boardid]->posts, Board_Post, post) 856 883 { 857 884 builder.AddShort(post->id); … … 935 962 this->armor = 0; 936 963 this->maxsp = 0; 937 UTIL_LIST_FOREACH_ALL(this->inventory, Character_Item, item) 938 { 939 this->weight += this->world->eif->Get(item.id)->weight * item.amount; 940 } 964 965 UTIL_PTR_LIST_FOREACH(this->inventory, Character_Item, item) 966 { 967 this->weight += this->world->eif->Get(item->id)->weight * item->amount; 968 } 969 941 970 UTIL_ARRAY_FOREACH_ALL(this->paperdoll, int, 15, i) 942 971 { … … 978 1007 { 979 1008 // TODO: This could be more efficient 980 restart_loop: 981 UTIL_LIST_FOREACH_ALL(this->inventory, Character_Item, item) 982 { 983 if (this->world->eif->Get(item.id)->special == EIF::Lore) 1009 UTIL_PTR_LIST_FOREACH(this->inventory, Character_Item, item) 1010 { 1011 if (this->world->eif->Get(item->id)->special == EIF::Lore) 984 1012 { 985 1013 continue; 986 1014 } 987 1015 988 Map_Item *map_item = this->player->character->map->AddItem(item.id, item.amount, this->x, this->y, 0); 989 this->DelItem(item.id, item.amount); 1016 Map_Item *map_item = this->player->character->map->AddItem(item->id, item->amount, this->x, this->y, 0); 990 1017 991 1018 if (map_item) … … 999 1026 { 1000 1027 map_item->owner = this->player->id; 1028 Console::Dbg("ProtectDeathDrop = %g\n", static_cast<double>(this->world->config["ProtectDeathDrop"])); 1001 1029 map_item->unprotecttime = Timer::GetTime() + static_cast<double>(this->world->config["ProtectDeathDrop"]); 1002 1030 } 1003 1031 1004 1032 PacketBuilder builder(PACKET_ITEM, PACKET_DROP); 1005 builder.AddShort(item .id);1006 builder.AddThree(item .amount);1033 builder.AddShort(item->id); 1034 builder.AddThree(item->amount); 1007 1035 builder.AddInt(0); 1008 1036 builder.AddShort(map_item->uid); … … 1014 1042 } 1015 1043 1016 goto restart_loop;1044 this->DelItem(item, item->amount); 1017 1045 } 1018 1046 … … 1095 1123 } 1096 1124 1125 void Character::Logout() 1126 { 1127 if (!this->online) 1128 { 1129 return; 1130 } 1131 1132 if (this->trading) 1133 { 1134 PacketBuilder builder(PACKET_TRADE, PACKET_CLOSE); 1135 builder.AddShort(this->id); 1136 this->trade_partner->player->client->SendBuilder(builder); 1137 1138 this->player->client->state = EOClient::Playing; 1139 this->trading = false; 1140 this->trade_inventory.clear(); 1141 this->trade_agree = false; 1142 1143 this->trade_partner->player->client->state = EOClient::Playing; 1144 this->trade_partner->trading = false; 1145 this->trade_partner->trade_inventory.clear(); 1146 this->trade_agree = false; 1147 1148 this->trade_partner->trade_partner = 0; 1149 this->trade_partner = 0; 1150 } 1151 1152 if (this->party) 1153 { 1154 this->party->Leave(this); 1155 } 1156 1157 if (this->arena) 1158 { 1159 --this->arena->occupants; 1160 } 1161 1162 UTIL_PTR_LIST_FOREACH(this->unregister_npc, NPC, npc) 1163 { 1164 UTIL_PTR_LIST_FOREACH(npc->damagelist, NPC_Opponent, checkopp) 1165 { 1166 if (checkopp->attacker == this) 1167 { 1168 npc->totaldamage -= checkopp->damage; 1169 npc->damagelist.erase(checkopp); 1170 break; 1171 } 1172 } 1173 } 1174 1175 this->world->Logout(this); 1176 1177 this->Save(); 1178 1179 this->online = false; 1180 } 1181 1097 1182 void Character::Save() 1098 1183 { 1099 1100 1184 #ifdef DEBUG 1101 1185 Console::Dbg("Saving character '%s' (session lasted %i minutes)", this->name.c_str(), int(std::time(0) - this->login_time) / 60); … … 1115 1199 Character::~Character() 1116 1200 { 1117 if (!this->online) 1118 { 1119 return; 1120 } 1121 1122 if (this->trading) 1123 { 1124 PacketBuilder builder(PACKET_TRADE, PACKET_CLOSE); 1125 builder.AddShort(this->id); 1126 this->trade_partner->player->client->SendBuilder(builder); 1127 1128 this->player->client->state = EOClient::Playing; 1129 this->trading = false; 1130 this->trade_inventory.clear(); 1131 this->trade_agree = false; 1132 1133 this->trade_partner->player->client->state = EOClient::Playing; 1134 this->trade_partner->trading = false; 1135 this->trade_partner->trade_inventory.clear(); 1136 this->trade_agree = false; 1137 1138 this->trade_partner->trade_partner = 0; 1139 this->trade_partner = 0; 1140 } 1141 1142 if (this->party) 1143 { 1144 this->party->Leave(this); 1145 } 1146 1147 if (this->arena) 1148 { 1149 --this->arena->occupants; 1150 } 1151 1152 UTIL_LIST_FOREACH_ALL(this->unregister_npc, NPC *, npc) 1153 { 1154 UTIL_LIST_IFOREACH_ALL(npc->damagelist, NPC_Opponent, checkopp) 1155 { 1156 if (checkopp->attacker == this) 1157 { 1158 npc->totaldamage -= checkopp->damage; 1159 npc->damagelist.erase(checkopp); 1160 break; 1161 } 1162 } 1163 } 1164 1165 this->world->Logout(this); 1166 1167 this->Save(); 1168 } 1201 this->Logout(); 1202 } -
eoserv/trunk/src/character.hpp
r168 r171 9 9 10 10 #include "stdafx.h" 11 #include "guild.hpp" 12 #include "script.hpp" 11 13 12 14 /** 13 15 * Serialize a list of items in to a text format that can be restored with ItemUnserialize 14 16 */ 15 std::string ItemSerialize( std::list<Character_Item>list);17 std::string ItemSerialize(const PtrList<Character_Item> &list); 16 18 17 19 /** 18 20 * Convert a string generated by ItemSerialze back to a list of items 19 21 */ 20 std::list<Character_Item> ItemUnserialize(std::string serialized);22 PtrList<Character_Item> ItemUnserialize(std::string serialized); 21 23 22 24 /** … … 33 35 * One type of item in a Characters inventory 34 36 */ 35 struct Character_Item 37 struct Character_Item : public Shared 36 38 { 37 39 short id; 38 40 int amount; 41 42 SCRIPT_REGISTER_REF_DF(Character_Item) 43 44 SCRIPT_REGISTER_END() 39 45 }; 40 46 … … 42 48 * One spell that a Character knows 43 49 */ 44 struct Character_Spell 50 struct Character_Spell : public Shared 45 51 { 46 52 short id; 47 53 unsigned char level; 54 55 SCRIPT_REGISTER_REF_DF(Character_Spell) 56 57 SCRIPT_REGISTER_END() 48 58 }; 49 59 50 class Character 60 class Character : public Shared 51 61 { 52 62 public: … … 93 103 Character *trade_partner; 94 104 bool trade_agree; 95 std::list<Character_Item> trade_inventory;105 PtrList<Character_Item> trade_inventory; 96 106 97 107 Character *party_trust_send; … … 123 133 }; 124 134 125 std::list<Character_Item> inventory;126 std::list<Character_Item> bank;135 PtrList<Character_Item> inventory; 136 PtrList<Character_Item> bank; 127 137 util::array<int, 15> paperdoll; 128 std::list<Character_Spell> spells;129 std::list<NPC *> unregister_npc;138 PtrList<Character_Spell> spells; 139 PtrList<NPC> unregister_npc; 130 140 131 141 Character(std::string name, World *); … … 134 144 135 145 void Msg(Character *from, std::string message); 146 void ServerMsg(std::string message); 136 147 bool Walk(Direction direction); 137 148 bool AdminWalk(Direction direction); … … 143 154 bool AddItem(short item, int amount); 144 155 bool DelItem(short item, int amount); 156 void DelItem(PtrList<Character_Item>::Iterator &, int amount); 145 157 bool AddTradeItem(short item, int amount); 146 158 bool DelTradeItem(short item); … … 150 162 bool InRange(Character *); 151 163 bool InRange(NPC *); 152 bool InRange(Map_Item );164 bool InRange(Map_Item *); 153 165 void Warp(short map, unsigned char x, unsigned char y, WarpAnimation animation = WARP_ANIMATION_NONE); 154 166 void Refresh(); … … 159 171 void DropAll(Character *killer); 160 172 173 void Logout(); 161 174 void Save(); 162 175 … … 170 183 Party *party; 171 184 Map *map; 185 186 static Character *ScriptFactory(std::string name, World *world) { return new Character(name, world); } 187 188 SCRIPT_REGISTER_REF(Character) 189 SCRIPT_REGISTER_FACTORY("Character @f(string name, World @)", ScriptFactory); 190 191 SCRIPT_REGISTER_VARIABLE("int", "login_time", login_time); 192 SCRIPT_REGISTER_VARIABLE("bool", "online", online); 193 SCRIPT_REGISTER_VARIABLE("bool", "nowhere", nowhere); 194 SCRIPT_REGISTER_VARIABLE("uint", "id", id); 195 SCRIPT_REGISTER_VARIABLE("AdminLevel", "admin", admin); 196 SCRIPT_REGISTER_VARIABLE("string", "name", name); 197 SCRIPT_REGISTER_VARIABLE("string", "title", title); 198 SCRIPT_REGISTER_VARIABLE("string", "home", home); 199 SCRIPT_REGISTER_VARIABLE("string", "partner", partner); 200 SCRIPT_REGISTER_VARIABLE("uint8", "clas", clas); 201 SCRIPT_REGISTER_VARIABLE("Gender", "gender", gender); 202 SCRIPT_REGISTER_VARIABLE("Skin", "race", race); 203 SCRIPT_REGISTER_VARIABLE("uint8", "hairstyle", hairstyle); 204 SCRIPT_REGISTER_VARIABLE("uint8", "haircolor", haircolor); 205 SCRIPT_REGISTER_VARIABLE("int16", "mapid", mapid); 206 SCRIPT_REGISTER_VARIABLE("uint8", "x", x); 207 SCRIPT_REGISTER_VARIABLE("uint8", "y", y); 208 SCRIPT_REGISTER_VARIABLE("uint8", "direction", direction); 209 SCRIPT_REGISTER_VARIABLE("int16", "spawnmap", spawnmap); 210 SCRIPT_REGISTER_VARIABLE("uint8", "spawnx", spawnx); 211 SCRIPT_REGISTER_VARIABLE("uint8", "spawny", spawny); 212 SCRIPT_REGISTER_VARIABLE("uint8", "level", level); 213 SCRIPT_REGISTER_VARIABLE("int", "exp", exp); 214 SCRIPT_REGISTER_VARIABLE("int16", "hp", hp); 215 SCRIPT_REGISTER_VARIABLE("int16", "tp", tp); 216 SCRIPT_REGISTER_VARIABLE("int16", "str", str); 217 SCRIPT_REGISTER_VARIABLE("int16", "intl", intl); 218 SCRIPT_REGISTER_VARIABLE("int16", "wis", wis); 219 SCRIPT_REGISTER_VARIABLE("int16", "agi", agi); 220 SCRIPT_REGISTER_VARIABLE("int16", "con", con); 221 SCRIPT_REGISTER_VARIABLE("int16", "cha", cha); 222 SCRIPT_REGISTER_VARIABLE("int16", "statpoints", statpoints); 223 SCRIPT_REGISTER_VARIABLE("int16", "skillpoints", skillpoints); 224 SCRIPT_REGISTER_VARIABLE("int16", "weight", weight); 225 SCRIPT_REGISTER_VARIABLE("int16", "maxweight", maxweight); 226 SCRIPT_REGISTER_VARIABLE("int16", "karma", karma); 227 SCRIPT_REGISTER_VARIABLE("SitAction", "sitting", sitting); 228 SCRIPT_REGISTER_VARIABLE("uint8", "visible", visible); 229 SCRIPT_REGISTER_VARIABLE("int", "bankmax", bankmax); 230 SCRIPT_REGISTER_VARIABLE("int", "goldbank", goldbank); 231 SCRIPT_REGISTER_VARIABLE("int", "usage", usage); 232 SCRIPT_REGISTER_VARIABLE("Arena @", " next_arena", next_arena); 233 SCRIPT_REGISTER_VARIABLE("Arena @", " arena", arena); 234 SCRIPT_REGISTER_VARIABLE("int8", "arena_kills", arena_kills); 235 SCRIPT_REGISTER_VARIABLE("int16", "maxsp", maxsp); 236 SCRIPT_REGISTER_VARIABLE("int16", "maxhp", maxhp); 237 SCRIPT_REGISTER_VARIABLE("int16", "maxtp", maxtp); 238 SCRIPT_REGISTER_VARIABLE("int16", "accuracy", accuracy); 239 SCRIPT_REGISTER_VARIABLE("int16", "evade", evade); 240 SCRIPT_REGISTER_VARIABLE("int16", "armor", armor); 241 SCRIPT_REGISTER_VARIABLE("int16", "mindam", mindam); 242 SCRIPT_REGISTER_VARIABLE("int16", "maxdam", maxdam); 243 SCRIPT_REGISTER_VARIABLE("bool", "trading", trading); 244 SCRIPT_REGISTER_VARIABLE("Character @", " trade_partner", trade_partner); 245 SCRIPT_REGISTER_VARIABLE("bool", "trade_agree", trade_agree); 246 SCRIPT_REGISTER_VARIABLE("PtrList<Character_Item>", "trade_inventory", trade_inventory); 247 SCRIPT_REGISTER_VARIABLE("Character @", " party_trust_send", party_trust_send); 248 SCRIPT_REGISTER_VARIABLE("Character @", " party_trust_recv", party_trust_recv); 249 SCRIPT_REGISTER_VARIABLE("PartyRequestType", "party_send_type", party_send_type); 250 SCRIPT_REGISTER_VARIABLE("NPC @", " shop_npc", shop_npc); 251 SCRIPT_REGISTER_VARIABLE("NPC @", " bank_npc", bank_npc); 252 SCRIPT_REGISTER_VARIABLE("WarpAnimation", "warp_anim", warp_anim); 253 SCRIPT_REGISTER_VARIABLE("PtrList<Character_Item>", "inventory", inventory); 254 SCRIPT_REGISTER_VARIABLE("PtrList<Character_Item>", "bank", bank); 255 //SCRIPT_REGISTER_VARIABLE("Array<int, 15>", "paperdoll", paperdoll); 256 SCRIPT_REGISTER_VARIABLE("PtrList<Character_Spell>", "spells", spells); 257 SCRIPT_REGISTER_VARIABLE("PtrList<NPC>", " unregister_npc", unregister_npc); 258 SCRIPT_REGISTER_VARIABLE("World @", " world", world); 259 SCRIPT_REGISTER_VARIABLE("Player @", " player", player); 260 SCRIPT_REGISTER_VARIABLE("Guild @", " guild", guild); 261 SCRIPT_REGISTER_VARIABLE("string", "guild_tag", guild_tag); 262 SCRIPT_REGISTER_VARIABLE("uint8", "guild_rank", guild_rank); 263 SCRIPT_REGISTER_VARIABLE("Party @", " party", party); 264 SCRIPT_REGISTER_VARIABLE("Map @", " map", map); 265 SCRIPT_REGISTER_FUNCTION("void Msg(Character @from, string message)", Msg); 266 SCRIPT_REGISTER_FUNCTION("void ServerMsg(string message)", ServerMsg); 267 SCRIPT_REGISTER_FUNCTION("bool Walk(Direction direction)", Walk); 268 SCRIPT_REGISTER_FUNCTION("bool AdminWalk(Direction direction)", AdminWalk); 269 SCRIPT_REGISTER_FUNCTION("void Attack(Direction direction)", Attack); 270 SCRIPT_REGISTER_FUNCTION("void Sit(SitAction sit_type)", Sit); 271 SCRIPT_REGISTER_FUNCTION("void Stand()", Stand); 272 SCRIPT_REGISTER_FUNCTION("void Emote(Emote emote, bool relay)", Emote); 273 SCRIPT_REGISTER_FUNCTION("int HasItem(int16 item)", HasItem); 274 SCRIPT_REGISTER_FUNCTION("bool AddItem(int16 item, int amount)", AddItem); 275 SCRIPT_REGISTER_FUNCTION_PR("bool DelItem(int16 item, int amount)", DelItem, (short, int), bool); 276 SCRIPT_REGISTER_FUNCTION("bool AddTradeItem(int16 item, int amount)", AddTradeItem); 277 SCRIPT_REGISTER_FUNCTION("bool DelTradeItem(int16 item)", DelTradeItem); 278 SCRIPT_REGISTER_FUNCTION("bool Unequip(int16 item, uint8 subloc)", Unequip); 279 SCRIPT_REGISTER_FUNCTION("bool Equip(int16 item, uint8 subloc)", Equip); 280 SCRIPT_REGISTER_FUNCTION_PR("bool InRange(uint8 x, uint8 y)", InRange, (unsigned char, unsigned char), bool); 281 SCRIPT_REGISTER_FUNCTION_PR("bool InRange(Character @)", InRange, (Character *), bool); 282 SCRIPT_REGISTER_FUNCTION_PR("bool InRange(NPC @)", InRange, (NPC *), bool); 283 SCRIPT_REGISTER_FUNCTION_PR("bool InRange(Map_Item @)", InRange, (Map_Item *), bool); 284 SCRIPT_REGISTER_FUNCTION("void Warp(int16 map, uint8 x, uint8 y, WarpAnimation animation)", Warp); 285 SCRIPT_REGISTER_FUNCTION("void Refresh()", Refresh); 286 SCRIPT_REGISTER_FUNCTION("void ShowBoard(int boardid)", ShowBoard); 287 SCRIPT_REGISTER_FUNCTION("string PaddedGuildTag()", PaddedGuildTag); 288 SCRIPT_REGISTER_FUNCTION("int Usage()", Usage); 289 SCRIPT_REGISTER_FUNCTION("void CalculateStats()", CalculateStats); 290 SCRIPT_REGISTER_FUNCTION("void DropAll(Character @killer)", DropAll); 291 SCRIPT_REGISTER_FUNCTION("void Save()", Save); 292 SCRIPT_REGISTER_END() 172 293 }; 173 294 -
eoserv/trunk/src/config.hpp
r168 r171 45 45 */ 46 46 void Read(std::string filename); 47 48 SCRIPT_REGISTER_REF_DF(Config) 49 SCRIPT_REGISTER_FUNCTION("void Read(string filename)", Read); 50 SCRIPT_REGISTER_END() 47 51 }; 48 52 -
eoserv/trunk/src/console.cpp
r168 r171 8 8 9 9 #include <cstdio> 10 #include <cstdarg> 10 11 11 12 #if defined(WIN32) || defined(WIN64) -
eoserv/trunk/src/console.hpp
r168 r171 8 8 #define CONSOLE_HPP_INCLUDED 9 9 10 #include "fwd/console.hpp" 11 10 12 #include <string> 13 14 #include "script.hpp" 11 15 12 16 namespace Console … … 52 56 void Dbg(std::string f, ...); 53 57 58 inline void ScriptRegister(ScriptEngine &engine) 59 { 60 engine.as->RegisterGlobalFunction("void Out(string)", asFUNCTION(Out), asCALL_CDECL); 61 engine.as->RegisterGlobalFunction("void Wrn(string)", asFUNCTION(Wrn), asCALL_CDECL); 62 engine.as->RegisterGlobalFunction("void Err(string)", asFUNCTION(Err), asCALL_CDECL); 63 engine.as->RegisterGlobalFunction("void Dbg(string)", asFUNCTION(Dbg), asCALL_CDECL); 64 } 65 54 66 } 55 67 -
eoserv/trunk/src/database.cpp
r168 r171 39 39 } 40 40 41 ((Database *)data)->callbackdata.push_back(result);41 static_cast<Database *>(data)->callbackdata.push_back(result); 42 42 return 0; 43 43 } … … 104 104 throw Database_OpenFailed(mysql_error(this->mysql_handle)); 105 105 } 106 106 107 this->connected = true; 108 107 109 break; 108 110 #endif // DATABASE_MYSQL … … 114 116 throw Database_OpenFailed(sqlite3_errmsg(this->sqlite_handle)); 115 117 } 118 116 119 this->connected = true; 120 117 121 break; 118 122 #endif // DATABASE_SQLITE … … 131 135 132 136 this->connected = false; 137 133 138 switch (this->engine) 134 139 { … … 156 161 va_list ap; 157 162 va_start(ap, format); 163 158 164 std::string finalquery; 159 165 int tempi; … … 164 170 for (const char *p = format; *p != '\0'; ++p) 165 171 { 166 if (*p == '#'){ 172 if (*p == '#') 173 { 167 174 tempi = va_arg(ap,int); 168 175 finalquery += util::to_string(tempi); 169 } else if (*p == '@'){ 176 } 177 else if (*p == '@') 178 { 170 179 tempc = va_arg(ap,char *); 171 180 finalquery += static_cast<std::string>(tempc); 172 } else if (*p == '$'){ 181 } 182 else if (*p == '$') 183 { 173 184 tempc = va_arg(ap,char *); 174 185 switch (this->engine) … … 192 203 #endif // DATABASE_SQLITE 193 204 } 194 } else { 205 } 206 else 207 { 195 208 finalquery += *p; 196 209 } 197 210 } 211 198 212 va_end(ap); 199 213 … … 215 229 { 216 230 int myerr = mysql_errno(this->mysql_handle); 231 217 232 if (myerr == CR_SERVER_GONE_ERROR || myerr == CR_SERVER_LOST) 218 233 { -
eoserv/trunk/src/database.hpp
r168 r171 163 163 */ 164 164 Database_Result callbackdata; 165 166 SCRIPT_REGISTER_REF_DF(Database) 167 SCRIPT_REGISTER_ENUM("Engine"); 168 SCRIPT_REGISTER_ENUM_VALUE("Engine", MySQL); 169 SCRIPT_REGISTER_ENUM_VALUE("Engine", SQLite); 170 171 SCRIPT_REGISTER_FUNCTION("void Connect(Engine type, string host, string user, string pass, string db)", Connect); 172 SCRIPT_REGISTER_FUNCTION("void Close()", Close); 173 SCRIPT_REGISTER_FUNCTION("string Escape(string)", Escape); 174 SCRIPT_REGISTER_END() 165 175 }; 166 176 -
eoserv/trunk/src/eoclient.cpp
r168 r171 132 132 void EOClient::SendBuilder(PacketBuilder &builder) 133 133 { 134 std::string packet = static_cast<std::string >(builder);134 std::string packet(builder); 135 135 this->Send(this->processor.Encode(packet)); 136 136 } … … 140 140 if (this->player) 141 141 { 142 delete this->player; // Player handles removing himself from the world142 this->player->Logout(); 143 143 } 144 144 } -
eoserv/trunk/src/eoclient.hpp
r168 r171 10 10 #include "stdafx.h" 11 11 12 #include "eoserver.hpp" 12 13 #include "packet.hpp" 13 14 #include "socket.hpp" … … 86 87 PacketProcessor processor; 87 88 88 EOClient( void *void_server) : Client(void_server), server(static_cast<EOServer *>(void_server))89 EOClient(EOServer *server_) : Client(server_), server(server_) 89 90 { 90 91 this->Initialize(); 91 92 } 92 93 93 EOClient(SOCKET s, sockaddr_in sa, void *void_server) : Client(s, sa, void_server), server(static_cast<EOServer *>(void_server))94 EOClient(SOCKET s, sockaddr_in sa, EOServer *server_) : Client(s, sa, server_), server(server_) 94 95 { 95 96 this->Initialize(); … … 141 142 #endif // DOXYGEN 142 143 143 virtual~EOClient();144 ~EOClient(); 144 145 }; 145 146 -
eoserv/trunk/src/eoconst.hpp
r168 r171 186 186 }; 187 187 188 namespace eoconst 189 { 190 inline void ScriptRegister(ScriptEngine &engine) 191 { 192 SCRIPT_REGISTER_ENUM("AdminLevel"); 193 SCRIPT_REGISTER_ENUM_VALUE("AdminLevel", ADMIN_PLAYER); 194 SCRIPT_REGISTER_ENUM_VALUE("AdminLevel", ADMIN_GUIDE); 195 SCRIPT_REGISTER_ENUM_VALUE("AdminLevel", ADMIN_GUARDIAN); 196 SCRIPT_REGISTER_ENUM_VALUE("AdminLevel", ADMIN_GM); 197 SCRIPT_REGISTER_ENUM_VALUE("AdminLevel", ADMIN_HGM); 198 SCRIPT_REGISTER_ENUM("Direction"); 199 SCRIPT_REGISTER_ENUM_VALUE("Direction", DIRECTION_DOWN); 200 SCRIPT_REGISTER_ENUM_VALUE("Direction", DIRECTION_LEFT); 201 SCRIPT_REGISTER_ENUM_VALUE("Direction", DIRECTION_UP); 202 SCRIPT_REGISTER_ENUM_VALUE("Direction", DIRECTION_RIGHT); 203 SCRIPT_REGISTER_ENUM("SitState"); 204 SCRIPT_REGISTER_ENUM_VALUE("SitState", SIT_SITTING); 205 SCRIPT_REGISTER_ENUM_VALUE("SitState", SIT_STANDING); 206 SCRIPT_REGISTER_ENUM("Emote"); 207 SCRIPT_REGISTER_ENUM_VALUE("Emote", EMOTE_HAPPY); 208 SCRIPT_REGISTER_ENUM_VALUE("Emote", EMOTE_DEPRESSED); 209 SCRIPT_REGISTER_ENUM_VALUE("Emote", EMOTE_SAD); 210 SCRIPT_REGISTER_ENUM_VALUE("Emote", EMOTE_ANGRY); 211 SCRIPT_REGISTER_ENUM_VALUE("Emote", EMOTE_CONFUSED); 212 SCRIPT_REGISTER_ENUM_VALUE("Emote", EMOTE_SURPRISED); 213 SCRIPT_REGISTER_ENUM_VALUE("Emote", EMOTE_HEARTS); 214 SCRIPT_REGISTER_ENUM_VALUE("Emote", EMOTE_MOON); 215 SCRIPT_REGISTER_ENUM_VALUE("Emote", EMOTE_SUICIDAL); 216 SCRIPT_REGISTER_ENUM_VALUE("Emote", EMOTE_EMBARASSED); 217 SCRIPT_REGISTER_ENUM_VALUE("Emote", EMOTE_DRUNK); 218 SCRIPT_REGISTER_ENUM_VALUE("Emote", EMOTE_TRADE); 219 SCRIPT_REGISTER_ENUM_VALUE("Emote", EMOTE_LEVELUP); 220 SCRIPT_REGISTER_ENUM_VALUE("Emote", EMOTE_PLAYFUL); 221 SCRIPT_REGISTER_ENUM("QuestAction"); 222 SCRIPT_REGISTER_ENUM_VALUE("QuestAction", QUEST_PROGRESS); 223 SCRIPT_REGISTER_ENUM_VALUE("QuestAction", QUEST_HISTORY); 224 SCRIPT_REGISTER_ENUM("FileType"); 225 SCRIPT_REGISTER_ENUM_VALUE("FileType", FILE_MAP); 226 SCRIPT_REGISTER_ENUM_VALUE("FileType", FILE_ITEM); 227 SCRIPT_REGISTER_ENUM_VALUE("FileType", FILE_NPC); 228 SCRIPT_REGISTER_ENUM_VALUE("FileType", FILE_SPELL); 229 SCRIPT_REGISTER_ENUM_VALUE("FileType", FILE_CLASS); 230 SCRIPT_REGISTER_ENUM("Gender"); 231 SCRIPT_REGISTER_ENUM_VALUE("Gender", GENDER_FEMALE); 232 SCRIPT_REGISTER_ENUM_VALUE("Gender", GENDER_MALE); 233 SCRIPT_REGISTER_ENUM("Skin"); 234 SCRIPT_REGISTER_ENUM_VALUE("Skin", SKIN_WHITE); 235 SCRIPT_REGISTER_ENUM_VALUE("Skin", SKIN_YELLOW); 236 SCRIPT_REGISTER_ENUM_VALUE("Skin", SKIN_TAN); 237 SCRIPT_REGISTER_ENUM_VALUE("Skin", SKIN_ORC); 238 SCRIPT_REGISTER_ENUM_VALUE("Skin", SKIN_SKELETON); 239 SCRIPT_REGISTER_ENUM_VALUE("Skin", SKIN_PANDA); 240 SCRIPT_REGISTER_ENUM_VALUE("Skin", SKIN_FISH); 241 SCRIPT_REGISTER_ENUM("PaperdollIcon"); 242 SCRIPT_REGISTER_ENUM_VALUE("PaperdollIcon", ICON_NORMAL); 243 SCRIPT_REGISTER_ENUM_VALUE("PaperdollIcon", ICON_GM); 244 SCRIPT_REGISTER_ENUM_VALUE("PaperdollIcon", ICON_HGM); 245 SCRIPT_REGISTER_ENUM_VALUE("PaperdollIcon", ICON_PARTY); 246 SCRIPT_REGISTER_ENUM_VALUE("PaperdollIcon", ICON_GM_PARTY); 247 SCRIPT_REGISTER_ENUM_VALUE("PaperdollIcon", ICON_HGM_PARTY); 248 SCRIPT_REGISTER_ENUM("PartyRequestType"); 249 SCRIPT_REGISTER_ENUM_VALUE("PartyRequestType", PARTY_REQUEST_JOIN); 250 SCRIPT_REGISTER_ENUM_VALUE("PartyRequestType", PARTY_REQUEST_INVITE); 251 SCRIPT_REGISTER_ENUM("ClothesSlot"); 252 SCRIPT_REGISTER_ENUM_VALUE("ClothesSlot", SLOT_CLOTHES); 253 SCRIPT_REGISTER_ENUM_VALUE("ClothesSlot", SLOT_HAIR); 254 SCRIPT_REGISTER_ENUM_VALUE("ClothesSlot", SLOT_HAIRCOLOR); 255 SCRIPT_REGISTER_ENUM("InitReply"); 256 SCRIPT_REGISTER_ENUM_VALUE("InitReply", INIT_OUT_OF_DATE); 257 SCRIPT_REGISTER_ENUM_VALUE("InitReply", INIT_OK); 258 SCRIPT_REGISTER_ENUM_VALUE("InitReply", INIT_BANNED); 259 SCRIPT_REGISTER_ENUM_VALUE("InitReply", INIT_FILE_MAP); 260 SCRIPT_REGISTER_ENUM_VALUE("InitReply", INIT_FILE_EIF); 261 SCRIPT_REGISTER_ENUM_VALUE("InitReply", INIT_FILE_ENF); 262 SCRIPT_REGISTER_ENUM_VALUE("InitReply", INIT_FILE_ESF); 263 SCRIPT_REGISTER_ENUM_VALUE("InitReply", INIT_PLAYERS); 264 SCRIPT_REGISTER_ENUM_VALUE("InitReply", INIT_MAP_MUTATION); 265 SCRIPT_REGISTER_ENUM_VALUE("InitReply", INIT_NOISE); 266 SCRIPT_REGISTER_ENUM_VALUE("InitReply", INIT_FILE_ECF); 267 SCRIPT_REGISTER_ENUM("InitBanType"); 268 SCRIPT_REGISTER_ENUM_VALUE("InitBanType", INIT_BAN_TEMP); 269 SCRIPT_REGISTER_ENUM_VALUE("InitBanType", INIT_BAN_PERM); 270 SCRIPT_REGISTER_ENUM("AccountReply"); 271 SCRIPT_REGISTER_ENUM_VALUE("AccountReply", ACCOUNT_EXISTS); 272 SCRIPT_REGISTER_ENUM_VALUE("AccountReply", ACCOUNT_NOT_APPROVED); 273 SCRIPT_REGISTER_ENUM_VALUE("AccountReply", ACCOUNT_CREATED); 274 SCRIPT_REGISTER_ENUM_VALUE("AccountReply", ACCOUNT_CHANGE_FAILED); 275 SCRIPT_REGISTER_ENUM_VALUE("AccountReply", ACCOUNT_CHANGED); 276 SCRIPT_REGISTER_ENUM_VALUE("AccountReply", ACCOUNT_CONTINUE); 277 SCRIPT_REGISTER_ENUM("CharacterReply"); 278 SCRIPT_REGISTER_ENUM_VALUE("CharacterReply", CHARACTER_EXISTS); 279 SCRIPT_REGISTER_ENUM_VALUE("CharacterReply", CHARACTER_FULL); 280 SCRIPT_REGISTER_ENUM_VALUE("CharacterReply", CHARACTER_NOT_APPROVED); 281 SCRIPT_REGISTER_ENUM_VALUE("CharacterReply", CHARACTER_OK); 282 SCRIPT_REGISTER_ENUM_VALUE("CharacterReply", CHARACTER_DELETED); 283 SCRIPT_REGISTER_ENUM("LoginReply"); 284 SCRIPT_REGISTER_ENUM_VALUE("LoginReply", LOGIN_WRONG_USER); 285 SCRIPT_REGISTER_ENUM_VALUE("LoginReply", LOGIN_WRONG_USERPASS); 286 SCRIPT_REGISTER_ENUM_VALUE("LoginReply", LOGIN_OK); 287 SCRIPT_REGISTER_ENUM_VALUE("LoginReply", LOGIN_LOGGEDIN); 288 SCRIPT_REGISTER_ENUM_VALUE("LoginReply", LOGIN_BUSY); 289 SCRIPT_REGISTER_ENUM("WarpReply"); 290 SCRIPT_REGISTER_ENUM_VALUE("WarpReply", WARP_LOCAL); 291 SCRIPT_REGISTER_ENUM_VALUE("WarpReply", WARP_SWITCH); 292 SCRIPT_REGISTER_ENUM("TalkReply"); 293 SCRIPT_REGISTER_ENUM_VALUE("TalkReply", TALK_NOTFOUND); 294 SCRIPT_REGISTER_ENUM("SitAction"); 295 SCRIPT_REGISTER_ENUM_VALUE("SitAction", SIT_STAND); 296 SCRIPT_REGISTER_ENUM_VALUE("SitAction", SIT_CHAIR); 297 SCRIPT_REGISTER_ENUM_VALUE("SitAction", SIT_FLOOR); 298 SCRIPT_REGISTER_ENUM("WarpAnimation"); 299 SCRIPT_REGISTER_ENUM_VALUE("WarpAnimation", WARP_ANIMATION_NONE); 300 SCRIPT_REGISTER_ENUM_VALUE("WarpAnimation", WARP_ANIMATION_SCROLL); 301 SCRIPT_REGISTER_ENUM_VALUE("WarpAnimation", WARP_ANIMATION_ADMIN); 302 SCRIPT_REGISTER_ENUM_VALUE("WarpAnimation", WARP_ANIMATION_INVALID); 303 SCRIPT_REGISTER_ENUM("MapEffect"); 304 SCRIPT_REGISTER_ENUM_VALUE("MapEffect", MAP_EFFECT_QUAKE); 305 } 306 307 } 188 308 189 309 #endif // EOCONST_HPP_INCLUDED -
eoserv/trunk/src/eodata.cpp
r168 r171 39 39 40 40 unsigned char namesize; 41 char *namebuf;42 41 std::string name; 43 42 char buf[EIF::DATA_SIZE] = {0}; 44 EIF_Data newdata; 45 46 this->data.resize(numobj+1, newdata); 47 48 this->data[0] = newdata; 43 44 this->data.resize(numobj+1); 45 46 this->data[0] = new EIF_Data; 49 47 50 48 SAFE_READ(static_cast<void *>(&namesize), sizeof(char), 1, fh); 51 49 for (int i = 1; i <= numobj; ++i) 52 50 { 51 EIF_Data *newdata = new EIF_Data; 52 53 53 namesize = PacketProcessor::Number(namesize); 54 namebuf = new char[namesize]; 55 SAFE_READ(namebuf, sizeof(char), namesize, fh); 56 name.assign(namebuf,namesize); 57 delete[] namebuf; 54 name.resize(namesize); 55 SAFE_READ(&name[0], sizeof(char), namesize, fh); 58 56 SAFE_READ(buf, sizeof(char), EIF::DATA_SIZE, fh); 59 57 60 newdata .id = i;61 newdata .name = name;62 63 newdata .graphic = PacketProcessor::Number(buf[0], buf[1]);64 newdata .type = static_cast<EIF::Type>(PacketProcessor::Number(buf[2]));65 newdata .subtype = static_cast<EIF::SubType>(PacketProcessor::Number(buf[3]));58 newdata->id = i; 59 newdata->name = name; 60 61 newdata->graphic = PacketProcessor::Number(buf[0], buf[1]); 62 newdata->type = static_cast<EIF::Type>(PacketProcessor::Number(buf[2])); 63 newdata->subtype = static_cast<EIF::SubType>(PacketProcessor::Number(buf[3])); 66 64 // Ranged gun hack 67 if (newdata .id == 365 && newdata.name == "Gun")68 { 69 newdata .subtype = EIF::Ranged;65 if (newdata->id == 365 && newdata->name == "Gun") 66 { 67 newdata->subtype = EIF::Ranged; 70 68 } 71 69 // / Ranged gun hack 72 newdata .special = static_cast<EIF::Special>(PacketProcessor::Number(buf[4]));73 newdata .hp = PacketProcessor::Number(buf[5], buf[6]);74 newdata .tp = PacketProcessor::Number(buf[7], buf[8]);75 newdata .mindam = PacketProcessor::Number(buf[9], buf[10]);76 newdata .maxdam = PacketProcessor::Number(buf[11], buf[12]);77 newdata .accuracy = PacketProcessor::Number(buf[13], buf[14]);78 newdata .evade = PacketProcessor::Number(buf[15], buf[16]);79 newdata .armor = PacketProcessor::Number(buf[17], buf[18]);80 newdata .str = PacketProcessor::Number(buf[20]);81 newdata .intl = PacketProcessor::Number(buf[21]);82 newdata .wis = PacketProcessor::Number(buf[22]);83 newdata .agi = PacketProcessor::Number(buf[23]);84 newdata .con = PacketProcessor::Number(buf[24]);85 newdata .cha = PacketProcessor::Number(buf[25]);86 newdata .scrollmap = PacketProcessor::Number(buf[32]);87 newdata .scrollx = PacketProcessor::Number(buf[35]);88 newdata .scrolly = PacketProcessor::Number(buf[36]);89 90 newdata .classreq = PacketProcessor::Number(buf[39]);91 92 newdata .weight = PacketProcessor::Number(buf[55]);70 newdata->special = static_cast<EIF::Special>(PacketProcessor::Number(buf[4])); 71 newdata->hp = PacketProcessor::Number(buf[5], buf[6]); 72 newdata->tp = PacketProcessor::Number(buf[7], buf[8]); 73 newdata->mindam = PacketProcessor::Number(buf[9], buf[10]); 74 newdata->maxdam = PacketProcessor::Number(buf[11], buf[12]); 75 newdata->accuracy = PacketProcessor::Number(buf[13], buf[14]); 76 newdata->evade = PacketProcessor::Number(buf[15], buf[16]); 77 newdata->armor = PacketProcessor::Number(buf[17], buf[18]); 78 newdata->str = PacketProcessor::Number(buf[20]); 79 newdata->intl = PacketProcessor::Number(buf[21]); 80 newdata->wis = PacketProcessor::Number(buf[22]); 81 newdata->agi = PacketProcessor::Number(buf[23]); 82 newdata->con = PacketProcessor::Number(buf[24]); 83 newdata->cha = PacketProcessor::Number(buf[25]); 84 newdata->scrollmap = PacketProcessor::Number(buf[32]); 85 newdata->scrollx = PacketProcessor::Number(buf[35]); 86 newdata->scrolly = PacketProcessor::Number(buf[36]); 87 88 newdata->classreq = PacketProcessor::Number(buf[39]); 89 90 newdata->weight = PacketProcessor::Number(buf[55]); 93 91 94 92 this->data[i] = newdata; … … 100 98 } 101 99 102 if ( newdata.name.compare("eof") == 0)100 if (this->data.back()->name.compare("eof") == 0) 103 101 { 104 102 this->data.pop_back(); … … 114 112 if (id > 0 && id < this->data.size()) 115 113 { 116 return &this->data[id];114 return this->data[id]; 117 115 } 118 116 else 119 117 { 120 return &this->data[0];118 return this->data[0]; 121 119 } 122 120 } … … 140 138 141 139 unsigned char namesize; 142 char *namebuf;143 140 std::string name; 144 141 char buf[ENF::DATA_SIZE] = {0}; 145 ENF_Data newdata; 146 147 this->data.resize(numobj+1, newdata); 148 149 this->data[0] = newdata; 142 143 this->data.resize(numobj+1); 144 145 this->data[0] = new ENF_Data; 150 146 151 147 SAFE_READ(static_cast<void *>(&namesize), sizeof(char), 1, fh); 152 148 for (int i = 1; i <= numobj; ++i) 153 149 { 150 ENF_Data *newdata = new ENF_Data; 151 154 152 namesize = PacketProcessor::Number(namesize); 155 namebuf = new char[namesize]; 156 SAFE_READ(namebuf, sizeof(char), namesize, fh); 157 name.assign(namebuf,namesize); 158 delete[] namebuf; 153 name.resize(namesize); 154 SAFE_READ(&name[0], sizeof(char), namesize, fh); 159 155 SAFE_READ(buf, sizeof(char), ENF::DATA_SIZE, fh); 160 156 161 newdata .id = i;162 newdata .name = name;163 164 newdata .graphic = PacketProcessor::Number(buf[0], buf[1]);165 166 newdata .boss = PacketProcessor::Number(buf[3], buf[4]);167 newdata .child = PacketProcessor::Number(buf[5], buf[6]);168 newdata .type = static_cast<ENF::Type>(PacketProcessor::Number(buf[7], buf[8]));169 newdata .hp = PacketProcessor::Number(buf[11], buf[12], buf[13]);170 171 newdata .mindam = PacketProcessor::Number(buf[16], buf[17]);172 newdata .maxdam = PacketProcessor::Number(buf[18], buf[19]);173 174 newdata .accuracy = PacketProcessor::Number(buf[20], buf[21]);175 newdata .evade = PacketProcessor::Number(buf[22], buf[23]);176 newdata .armor = PacketProcessor::Number(buf[24], buf[25]);177 178 newdata .exp = PacketProcessor::Number(buf[36], buf[37]);157 newdata->id = i; 158 newdata->name = name; 159 160 newdata->graphic = PacketProcessor::Number(buf[0], buf[1]); 161 162 newdata->boss = PacketProcessor::Number(buf[3], buf[4]); 163 newdata->child = PacketProcessor::Number(buf[5], buf[6]); 164 newdata->type = static_cast<ENF::Type>(PacketProcessor::Number(buf[7], buf[8])); 165 newdata->hp = PacketProcessor::Number(buf[11], buf[12], buf[13]); 166 167 newdata->mindam = PacketProcessor::Number(buf[16], buf[17]); 168 newdata->maxdam = PacketProcessor::Number(buf[18], buf[19]); 169 170 newdata->accuracy = PacketProcessor::Number(buf[20], buf[21]); 171 newdata->evade = PacketProcessor::Number(buf[22], buf[23]); 172 newdata->armor = PacketProcessor::Number(buf[24], buf[25]); 173 174 newdata->exp = PacketProcessor::Number(buf[36], buf[37]); 179 175 180 176 this->data[i] = newdata; … … 186 182 } 187 183 188 if ( newdata.name.compare("eof") == 0)184 if (this->data.back()->name.compare("eof") == 0) 189 185 { 190 186 this->data.pop_back(); … … 200 196 if (id > 0 && id < this->data.size()) 201 197 { 202 return &this->data[id];198 return this->data[id]; 203 199 } 204 200 else 205 201 { 206 return &this->data[0];202 return this->data[0]; 207 203 } 208 204 } … … 226 222 227 223 unsigned char namesize, shoutsize; 228 char *namebuf, *shoutbuf;229 224 std::string name, shout; 230 225 char buf[ESF::DATA_SIZE] = {0}; 231 ESF_Data newdata; 232 233 this->data.resize(numobj+1, newdata); 234 235 this->data[0] = newdata; 226 227 this->data.resize(numobj+1); 228 229 this->data[0] = new ESF_Data; 236 230 237 231 SAFE_READ(static_cast<void *>(&namesize), sizeof(char), 1, fh); … … 239 233 for (int i = 1; i <= numobj; ++i) 240 234 { 235 ESF_Data *newdata = new ESF_Data; 236 241 237 namesize = PacketProcessor::Number(namesize); 242 namebuf = new char[namesize]; 243 SAFE_READ(namebuf, sizeof(char), namesize, fh); 244 name.assign(namebuf, namesize); 245 delete[] namebuf; 238 name.resize(namesize); 239 if (namesize > 0) 240 { 241 SAFE_READ(&name[0], sizeof(char), namesize, fh); 242 } 246 243 247 244 shoutsize = PacketProcessor::Number(shoutsize); 248 shoutbuf = new char[shoutsize]; 249 SAFE_READ(shoutbuf, sizeof(char), shoutsize, fh); 250 shout.assign(shoutbuf, shoutsize); 251 delete[] shoutbuf; 245 shout.resize(shoutsize); 246 if (shoutsize > 0) 247 { 248 SAFE_READ(&shout[0], sizeof(char), shoutsize, fh); 249 } 252 250 253 251 SAFE_READ(buf, sizeof(char), ESF::DATA_SIZE, fh); 254 252 255 newdata .id = i;256 newdata .name = name;257 newdata .shout = shout;253 newdata->id = i; 254 newdata->name = name; 255 newdata->shout = shout; 258 256 259 257 this->data[i] = newdata; … … 270 268 } 271 269 272 if (this->data [numobj-1].name.compare("eof") == 0)270 if (this->data.back()->name.compare("eof") == 0) 273 271 { 274 272 this->data.pop_back(); … … 298 296 299 297 unsigned char namesize; 300 char *namebuf;301 298 std::string name; 302 299 char buf[ECF::DATA_SIZE] = {0}; 303 ECF_Data newdata; 304 305 this->data.resize(numobj+1, newdata); 306 307 this->data[0] = newdata; 300 301 this->data.resize(numobj+1); 302 303 this->data[0] = new ECF_Data; 308 304 309 305 SAFE_READ(static_cast<void *>(&namesize), sizeof(char), 1, fh); 310 306 for (int i = 1; i <= numobj; ++i) 311 307 { 308 ECF_Data *newdata = new ECF_Data; 309 312 310 namesize = PacketProcessor::Number(namesize); 313 namebuf = new char[namesize]; 314 SAFE_READ(namebuf, sizeof(char), namesize, fh); 315 name.assign(namebuf,namesize); 316 delete[] namebuf; 311 name.resize(namesize); 312 SAFE_READ(&name[0], sizeof(char), namesize, fh); 313 317 314 SAFE_READ(buf, sizeof(char), ECF::DATA_SIZE, fh); 318 315 319 newdata .id = i;320 newdata .name = name;316 newdata->id = i; 317 newdata->name = name; 321 318 322 319 this->data[i] = newdata; … … 328 325 } 329 326 330 if ( newdata.name.compare("eof") == 0)327 if (this->data.back()->name.compare("eof") == 0) 331 328 { 332 329 this->data.pop_back(); -
eoserv/trunk/src/eodata.hpp
r168 r171 13 13 * Loads and stores information on all items from an EIF file 14 14 */ 15 class EIF 15 class EIF : public Shared 16 16 { 17 17 public: … … 72 72 unsigned char rid[4]; 73 73 unsigned char len[2]; 74 std::vector<EIF_Data> data;74 PtrVector<EIF_Data> data; 75 75 EIF(std::string filename); 76 76 77 77 EIF_Data *Get(unsigned int id); 78 79 SCRIPT_REGISTER_REF(EIF) 80 81 SCRIPT_REGISTER_END() 78 82 }; 79 83 … … 81 85 * One item record in an EIF object 82 86 */ 83 struct EIF_Data 87 struct EIF_Data : public Shared 84 88 { 85 89 int id; … … 136 140 * Loads and stores information on all NPCs from an ENF file 137 141 */ 138 class ENF 142 class ENF : public Shared 139 143 { 140 144 public: … … 161 165 unsigned char rid[4]; 162 166 unsigned char len[2]; 163 std::vector<ENF_Data> data;167 PtrVector<ENF_Data> data; 164 168 ENF(std::string filename); 165 169 166 170 ENF_Data *Get(unsigned int id); 171 172 SCRIPT_REGISTER_REF(ENF) 173 174 SCRIPT_REGISTER_END() 167 175 }; 168 176 … … 170 178 * One NPC record in an ENF object 171 179 */ 172 struct ENF_Data 180 struct ENF_Data : public Shared 173 181 { 174 182 int id; … … 195 203 * Loads and stores information on all spells from an ESF file 196 204 */ 197 class ESF 205 class ESF : public Shared 198 206 { 199 207 public: … … 201 209 unsigned char rid[4]; 202 210 unsigned char len[2]; 203 std::vector<ESF_Data> data;211 PtrVector<ESF_Data> data; 204 212 ESF(std::string filename); 205 213 214 SCRIPT_REGISTER_REF(ESF) 215 216 SCRIPT_REGISTER_END() 206 217 }; 207 218 … … 209 220 * One spell record in an ESF object 210 221 */ 211 struct ESF_Data 222 struct ESF_Data : public Shared 212 223 { 213 224 int id; … … 221 232 * Loads and stores information on all classes from an ECF file 222 233 */ 223 class ECF 234 class ECF : public Shared 224 235 { 225 236 public: … … 227 238 unsigned char rid[4]; 228 239 unsigned char len[2]; 229 std::vector<ECF_Data> data;240 PtrVector<ECF_Data> data; 230 241 ECF(std::string filename); 231 242 243 SCRIPT_REGISTER_REF(ECF) 244 245 SCRIPT_REGISTER_END() 232 246 }; 233 247 … … 235 249 * One class record in an ECF object 236 250 */ 237 struct ECF_Data 251 struct ECF_Data : public Shared 238 252 { 239 253 int id; -
eoserv/trunk/src/eoserver.cpp
r168 r171 36 36 builder.AddChar(0); 37 37 38 UTIL_ LIST_FOREACH_ALL(server->clients, EOClient *, client)38 UTIL_PTR_LIST_FOREACH(server->clients, EOClient, client) 39 39 { 40 40 if (client->needpong) … … 55 55 double now = Timer::GetTime(); 56 56 57 UTIL_ LIST_FOREACH_ALL(server->clients, EOClient *, client)57 UTIL_PTR_LIST_FOREACH(server->clients, EOClient, client) 58 58 { 59 59 std::size_t size = client->queue.size(); … … 124 124 } 125 125 126 Client *EOServer::ClientFactory(SOCKET sock, sockaddr_in sin) 127 { 128 return new EOClient(sock, sin, this); 129 } 130 126 131 void EOServer::Initialize(util::array<std::string, 5> dbinfo, const Config &eoserv_config, const Config &admin_config) 127 132 { … … 146 151 if (this->sln) 147 152 { 148 delete this->sln;153 this->sln->Release(); 149 154 } 150 155 151 delete this->world;156 this->world->Release(); 152 157 } -
eoserv/trunk/src/eoserver.hpp
r168 r171 10 10 #include "stdafx.h" 11 11 12 #include "eoclient.hpp"13 12 #include "socket.hpp" 14 13 … … 19 18 * A server which accepts connections and creates EOClient instances from them 20 19 */ 21 class EOServer : public Server <EOClient>20 class EOServer : public Server 22 21 { 23 22 private: … … 25 24 SLN *sln; 26 25 26 protected: 27 Client *ClientFactory(SOCKET sock, sockaddr_in sin); 28 27 29 public: 28 30 World *world; 29 31 30 EOServer(IPAddress addr, unsigned short port, util::array<std::string, 5> dbinfo, const Config &eoserv_config, const Config &admin_config) : Server <EOClient>(addr, port)32 EOServer(IPAddress addr, unsigned short port, util::array<std::string, 5> dbinfo, const Config &eoserv_config, const Config &admin_config) : Server(addr, port) 31 33 { 32 34 this->Initialize(dbinfo, eoserv_config, admin_config); … … 34 36 35 37 ~EOServer(); 38 39 SCRIPT_REGISTER_REF(EOServer) 40 41 SCRIPT_REGISTER_END() 36 42 }; 37 43 -
eoserv/trunk/src/fwd/socket.hpp
r168 r171 10 10 class IPAddress; 11 11 class Client; 12 template <class>class Server;12 class Server; 13 13 14 14 /** -
eoserv/trunk/src/fwd/timer.hpp
r168 r171 12 12 struct TimeEvent; 13 13 14 typedef void(*TimerCallback)(void *); 15 14 16 #endif // FWD_TIMER_HPP_INCLUDED -
eoserv/trunk/src/guild.hpp
r168 r171 14 14 * Created by the World object when a member of the guild logs in, and destroyed when the last member logs out 15 15 */ 16 class Guild 16 class Guild : public Shared 17 17 { 18 18 public: 19 19 std::string tag; 20 20 std::string name; 21 std::vector<Character *> members;21 PtrVector<Character> members; 22 22 util::array<std::string, 9> ranks; 23 23 std::time_t created; 24 24 25 void Msg(Character *from, std::string message); 25 void Msg(PtrVector<Character> from, std::string message); 26 27 SCRIPT_REGISTER_REF_DF(Guild) 28 29 SCRIPT_REGISTER_END() 26 30 }; 27 31 -
eoserv/trunk/src/handlers/Account.cpp
r168 r171 18 18 std::string username = reader.GetEndString(); 19 19 20 u til::lowercase(username);20 username = util::lowercase(username); 21 21 22 22 reply.SetID(PACKET_ACCOUNT, PACKET_REPLY); … … 55 55 int hdid = util::to_int(reader.GetBreakString()); 56 56 57 u til::lowercase(username);57 username = util::lowercase(username); 58 58 59 59 reply.SetID(PACKET_ACCOUNT, PACKET_REPLY); … … 70 70 else 71 71 { 72 u til::lowercase(username);72 username = util::lowercase(username); 73 73 74 74 this->server->world->CreatePlayer(username, password, fullname, location, email, computer, util::to_string(hdid), static_cast<std::string>(this->GetRemoteAddr())); … … 121 121 CLIENT_SEND(reply); 122 122 123 delete changepass;123 changepass->Release(); 124 124 } 125 125 break; -
eoserv/trunk/src/handlers/Bank.cpp
r168 r171 23 23 short id = reader.GetShort(); 24 24 25 UTIL_ VECTOR_FOREACH_ALL(this->player->character->map->npcs, NPC *, npc)25 UTIL_PTR_VECTOR_FOREACH(this->player->character->map->npcs, NPC, npc) 26 26 { 27 27 if (npc->index == id && npc->data->type == ENF::Bank) 28 28 { 29 this->player->character->bank_npc = npc;29 this->player->character->bank_npc = *npc; 30 30 31 31 reply.SetID(PACKET_BANK, PACKET_OPEN); -
eoserv/trunk/src/handlers/Board.cpp
r168 r171 32 32 } 33 33 34 UTIL_ LIST_IFOREACH_ALL(this->server->world->boards[boardid]->posts, Board_Post *, post)34 UTIL_PTR_LIST_FOREACH(this->server->world->boards[boardid]->posts, Board_Post, post) 35 35 { 36 if ( (*post)->id == postid)36 if (post->id == postid) 37 37 { 38 if ( (*post)->author_admin < this->player->character->admin39 || (*post)->author == this->player->character->name)38 if (post->author_admin < this->player->character->admin 39 || post->author == this->player->character->name) 40 40 { 41 41 this->server->world->boards[boardid]->posts.erase(post); … … 78 78 int recent_post_count = 0; 79 79 80 UTIL_ LIST_FOREACH_ALL(this->server->world->boards[boardid]->posts, Board_Post *, post)80 UTIL_PTR_LIST_FOREACH(this->server->world->boards[boardid]->posts, Board_Post, post) 81 81 { 82 82 if (post->author == this->player->character->name) … … 137 137 } 138 138 139 UTIL_ LIST_FOREACH_ALL(this->server->world->boards[boardid]->posts, Board_Post *, post)139 UTIL_PTR_LIST_FOREACH(this->server->world->boards[boardid]->posts, Board_Post, post) 140 140 { 141 141 if (post->id == postid) -
eoserv/trunk/src/handlers/Chair.cpp
r168 r171 31 31 } 32 32 33 UTIL_ LIST_FOREACH_ALL(this->player->character->map->characters, Character *, character)33 UTIL_PTR_LIST_FOREACH(this->player->character->map->characters, Character, character) 34 34 { 35 35 if (character->x == x && character->y == y) -
eoserv/trunk/src/handlers/Character.cpp
r168 r171 38 38 reader.GetByte(); 39 39 std::string name = reader.GetBreakString(); 40 util::lowercase(name);40 name = util::lowercase(name); 41 41 42 42 if (gender != GENDER_MALE && gender != GENDER_FEMALE) return false; … … 68 68 reply.AddByte(1); // ?? 69 69 reply.AddByte(255); 70 UTIL_ VECTOR_FOREACH_ALL(this->player->characters, Character *, character)70 UTIL_PTR_VECTOR_FOREACH(this->player->characters, Character, character) 71 71 { 72 72 reply.AddBreakString(character->name); … … 100 100 101 101 bool yourchar = false; 102 std::vector<Character *>::iterator char_it;102 PtrVector<Character>::Iterator char_it(this->player->characters); 103 103 104 UTIL_ VECTOR_IFOREACH(this->player->characters.begin(), this->player->characters.end(), Character *, character)104 UTIL_PTR_VECTOR_FOREACH(this->player->characters, Character, character) 105 105 { 106 if ( (*character)->id == charid)106 if (character->id == charid) 107 107 { 108 Console::Out("Deleted character: %s (%s)", (*character)->name.c_str(), this->player->username.c_str());109 this->server->world->DeleteCharacter( (*character)->name);108 Console::Out("Deleted character: %s (%s)", character->name.c_str(), this->player->username.c_str()); 109 this->server->world->DeleteCharacter(character->name); 110 110 char_it = character; 111 111 yourchar = true; … … 126 126 reply.AddByte(1); // ?? 127 127 reply.AddByte(255); 128 UTIL_ VECTOR_FOREACH_ALL(this->player->characters, Character *, character)128 UTIL_PTR_VECTOR_FOREACH(this->player->characters, Character, character) 129 129 { 130 130 reply.AddBreakString(character->name); … … 155 155 bool yourchar = false; 156 156 157 UTIL_ VECTOR_FOREACH_ALL(this->player->characters, Character *, character)157 UTIL_PTR_VECTOR_FOREACH(this->player->characters, Character, character) 158 158 { 159 159 if (character->id == charid) -
eoserv/trunk/src/handlers/Chest.cpp
r168 r171 34 34 if (this->player->character->map->GetSpec(x, y) == Map_Tile::Chest) 35 35 { 36 UTIL_ VECTOR_FOREACH_ALL(this->player->character->map->chests, Map_Chest *, chest)36 UTIL_PTR_VECTOR_FOREACH(this->player->character->map->chests, Map_Chest, chest) 37 37 { 38 38 if (chest->x == x && chest->y == y) … … 49 49 reply.AddChar(this->player->character->maxweight); 50 50 51 UTIL_ LIST_FOREACH_ALL(chest->items, Map_Chest_Item, item)51 UTIL_PTR_LIST_FOREACH(chest->items, Map_Chest_Item, item) 52 52 { 53 if (item .id != 0)53 if (item->id != 0) 54 54 { 55 reply.AddShort(item .id);56 reply.AddThree(item .amount);55 reply.AddShort(item->id); 56 reply.AddThree(item->amount); 57 57 } 58 58 } … … 80 80 if (this->player->character->map->GetSpec(x, y) == Map_Tile::Chest) 81 81 { 82 UTIL_ VECTOR_FOREACH_ALL(this->player->character->map->chests, Map_Chest *, chest)82 UTIL_PTR_VECTOR_FOREACH(this->player->character->map->chests, Map_Chest, chest) 83 83 { 84 84 if (chest->x == x && chest->y == y) … … 97 97 reply.AddChar(this->player->character->maxweight); 98 98 99 UTIL_ LIST_FOREACH_ALL(chest->items, Map_Chest_Item, item)99 UTIL_PTR_LIST_FOREACH(chest->items, Map_Chest_Item, item) 100 100 { 101 if (item .id != 0)101 if (item->id != 0) 102 102 { 103 reply.AddShort(item .id);104 reply.AddThree(item .amount);103 reply.AddShort(item->id); 104 reply.AddThree(item->amount); 105 105 } 106 106 } … … 131 131 reply.AddChar(y); 132 132 133 UTIL_ VECTOR_FOREACH_ALL(this->player->character->map->chests, Map_Chest *, chest)133 UTIL_PTR_VECTOR_FOREACH(this->player->character->map->chests, Map_Chest, chest) 134 134 { 135 135 if (chest->x == x && chest->y == y) 136 136 { 137 UTIL_ LIST_FOREACH_ALL(chest->items, Map_Chest_Item, item)137 UTIL_PTR_LIST_FOREACH(chest->items, Map_Chest_Item, item) 138 138 { 139 if (item .id != 0)139 if (item->id != 0) 140 140 { 141 reply.AddShort(item .id);142 reply.AddThree(item .amount);141 reply.AddShort(item->id); 142 reply.AddThree(item->amount); 143 143 } 144 144 } -
eoserv/trunk/src/handlers/Init.cpp
r168 r171 10 10 { 11 11 ++i; 12 int a = ((i % 11 + 1) * 119);13 12 14 if (a == 0) 15 { 16 return 0; 17 } 18 19 return 110905 + (i % 9 + 1) * ((11092004 - i) % a) * 119 + i % 2004; 13 return 110905 + (i % 9 + 1) * ((11092004 - i) % ((i % 11 + 1) * 119)) * 119 + i % 2004; 20 14 } 21 15 -
eoserv/trunk/src/handlers/Internal.cpp
r168 r171 6 6 7 7 #include "handlers.h" 8 9 #include "map.hpp" 8 10 9 11 CLIENT_F_FUNC(Internal) -
eoserv/trunk/src/handlers/Item.cpp
r168 r171 96 96 builder.AddChar(int(double(this->player->character->hp) / double(this->player->character->maxhp) * 100.0)); 97 97 98 UTIL_ LIST_FOREACH_ALL(this->player->character->map->characters, Character *, character)99 { 100 if ( character != this->player->character && this->player->character->InRange(character))98 UTIL_PTR_LIST_FOREACH(this->player->character->map->characters, Character, character) 99 { 100 if (*character != this->player->character && this->player->character->InRange(*character)) 101 101 { 102 102 character->player->client->SendBuilder(builder); … … 129 129 builder.AddChar(item->haircolor); 130 130 131 UTIL_ LIST_FOREACH_ALL(this->player->character->map->characters, Character *, character)132 { 133 if ( character != this->player->character && this->player->character->InRange(character))131 UTIL_PTR_LIST_FOREACH(this->player->character->map->characters, Character, character) 132 { 133 if (*character != this->player->character && this->player->character->InRange(*character)) 134 134 { 135 135 character->player->client->SendBuilder(builder); … … 208 208 { 209 209 item->owner = this->player->id; 210 item->unprotecttime = Timer::GetTime() + static_cast<double>(this->server->world->config["Pro ctectPlayerDrop"]);210 item->unprotecttime = Timer::GetTime() + static_cast<double>(this->server->world->config["ProtectPlayerDrop"]); 211 211 this->player->character->DelItem(id, amount); 212 212 … … 254 254 int uid = reader.GetShort(); 255 255 256 UTIL_LIST_FOREACH_ALL(this->player->character->map->items, Map_Item, item)257 {258 if (item.uid == uid)259 {260 int distance = util::path_length(item.x, item.y, this->player->character->x, this->player->character->y); 261 262 if (distance > static_cast<int>(this->server->world->config["DropDistance"]))263 {264 break;265 } 266 267 if (item.owner != this->player->id && item.unprotecttime > Timer::GetTime())268 {269 break;270 } 271 272 this->player->character->AddItem(item.id, item.amount); 273 this->player->character->map->DelItem(uid, this->player->character);274 275 reply.SetID(PACKET_ITEM, PACKET_GET);276 reply.AddShort(uid);277 reply.AddShort(item.id);278 reply.AddThree(item.amount);279 reply.AddChar(this->player->character->weight);280 reply.AddChar(this->player->character->maxweight); 281 CLIENT_SEND(reply);282 break; 283 }256 Map_Item *item = this->player->character->map->GetItem(uid); 257 if (item) 258 { 259 int distance = util::path_length(item->x, item->y, this->player->character->x, this->player->character->y); 260 261 if (distance > static_cast<int>(this->server->world->config["DropDistance"])) 262 { 263 break; 264 } 265 266
