Changeset 171

Show
Ignore:
Timestamp:
12/15/09 16:06:58 (9 months ago)
Author:
sausage
Message:

Pointer-only containers for easier script use and less generated code,
AngelScript? support for new containers,
Reference counted objects,
More script registrations,
Removed a stupid check in stupid_hash,
Stop sending the "deadly" and "globalpk" to the SLN flags if they're not set,
Removed pointless Server template (uses polymorphic Client now),
$objects admin command (shows number of shared object allocated),
Stop deposit of 0x items in chests and lockers,
Can safely use different MapDirs?,
Fix config typo: ProctectPlayerDrop? -> ProtectPlayerDrop?

Location:
eoserv/trunk
Files:
11 added
3 removed
71 modified

Legend:

Unmodified
Added
Removed
  • eoserv/trunk/Makefile.all

    r168 r171  
    4949       $(OBJDIR)/script.o \ 
    5050       $(OBJDIR)/scriptlibc.o \ 
     51       $(OBJDIR)/scriptreg.o \ 
    5152       $(OBJDIR)/sha256.o \ 
     53       $(OBJDIR)/shared.o \ 
    5254       $(OBJDIR)/sln.o \ 
    5355       $(OBJDIR)/socket.o \ 
     
    5557       $(OBJDIR)/util.o \ 
    5658       $(OBJDIR)/world.o \ 
     59       $(OBJDIR)/container/ptr_list.o \ 
     60       $(OBJDIR)/container/ptr_vector.o \ 
    5761       $(OBJDIR)/handlers/Account.o \ 
    5862       $(OBJDIR)/handlers/AdminInteract.o \ 
     
    119123create-build-dirs: 
    120124        -@mkdir $(OBJDIR) 
     125        -@mkdir $(OBJDIR)/container 
    121126        -@mkdir $(OBJDIR)/extra 
    122127        -@mkdir $(OBJDIR)/handlers 
    123128 
    124129$(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) 
    126131 
    127132$(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) 
    129134 
    130135eoserv: create-build-dirs $(OBJ) 
  • eoserv/trunk/admin.ini

    r157 r171  
    3030# $info character 
    3131info = 1 
     32 
     33# Shows the server uptime 
     34# $uptime 
     35uptime = 1 
     36 
     37# Shows the number of allocated shared objects 
     38# $objects 
     39objects = 4 
    3240 
    3341 
  • eoserv/trunk/config.ini

    r169 r171  
    363363# Protect drops from players 
    364364# Shouldn't be lowered unless using a custom client which supports it 
    365 ProctectPlayerDrop = 5s 
     365ProtectPlayerDrop = 5s 
    366366 
    367367## ProtectNPCDrop (number) 
  • eoserv/trunk/project/mingw.cbp

    r168 r171  
    1616                                <Compiler> 
    1717                                        <Add option="-g" /> 
     18                                        <Add option="-D_GLIBCXX_DEBUG" /> 
     19                                        <Add option="-D_GLIBCXX_DEBUG_PEDANTIC" /> 
    1820                                        <Add option="-DDEBUG" /> 
    1921                                        <Add option="-DDATABASE_DEBUG" /> 
     
    114116                        <Add directory="..\src\extra\" /> 
    115117                        <Add directory="..\src\handlers\" /> 
     118                        <Add directory="..\src\container\" /> 
    116119                </Compiler> 
    117120                <Linker> 
     
    135138                <Unit filename="..\src\console.cpp" /> 
    136139                <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" /> 
    137147                <Unit filename="..\src\database.cpp" /> 
    138148                <Unit filename="..\src\database.hpp" /> 
     
    149159                <Unit filename="..\src\fwd\character.hpp" /> 
    150160                <Unit filename="..\src\fwd\config.hpp" /> 
     161                <Unit filename="..\src\fwd\console.hpp" /> 
    151162                <Unit filename="..\src\fwd\database.hpp" /> 
    152163                <Unit filename="..\src\fwd\eoclient.hpp" /> 
     
    154165                <Unit filename="..\src\fwd\eoserver.hpp" /> 
    155166                <Unit filename="..\src\fwd\guild.hpp" /> 
    156                 <Unit filename="..\src\fwd\hook.hpp" /> 
    157167                <Unit filename="..\src\fwd\map.hpp" /> 
    158168                <Unit filename="..\src\fwd\nanohttp.hpp" /> 
     
    161171                <Unit filename="..\src\fwd\party.hpp" /> 
    162172                <Unit filename="..\src\fwd\player.hpp" /> 
    163                 <Unit filename="..\src\fwd\script.hpp" /> 
    164173                <Unit filename="..\src\fwd\sln.hpp" /> 
    165174                <Unit filename="..\src\fwd\socket.hpp" /> 
     
    230239                <Unit filename="..\src\scriptreg.cpp" /> 
    231240                <Unit filename="..\src\scriptreg.hpp" /> 
    232                 <Unit filename="..\src\scriptstl.h" /> 
    233241                <Unit filename="..\src\sha256.c"> 
    234242                        <Option compilerVar="CC" /> 
    235243                </Unit> 
    236244                <Unit filename="..\src\sha256.h" /> 
     245                <Unit filename="..\src\shared.cpp" /> 
     246                <Unit filename="..\src\shared.hpp" /> 
    237247                <Unit filename="..\src\sln.cpp" /> 
    238248                <Unit filename="..\src\sln.hpp" /> 
  • eoserv/trunk/src/arena.cpp

    r168 r171  
    3737        int newplayers = 0; 
    3838 
    39         UTIL_VECTOR_FOREACH_ALL(this->spawns, Arena_Spawn, spawn) 
     39        UTIL_PTR_VECTOR_FOREACH(this->spawns, Arena_Spawn, spawn) 
    4040        { 
    41                 UTIL_LIST_FOREACH_ALL(this->map->characters, Character *, character) 
     41                UTIL_PTR_LIST_FOREACH(this->map->characters, Character, character) 
    4242                { 
    43                         if (character->x == spawn.sx && character->y == spawn.sy) 
     43                        if (character->x == spawn->sx && character->y == spawn->sy) 
    4444                        { 
    4545                                ++newplayers; 
     
    5757                PacketBuilder builder(PACKET_ARENA, PACKET_DROP); 
    5858 
    59                 UTIL_LIST_FOREACH_ALL(this->map->characters, Character *, character) 
     59                UTIL_PTR_LIST_FOREACH(this->map->characters, Character, character) 
    6060                { 
    6161                        character->player->client->SendBuilder(builder); 
     
    6565        } 
    6666 
    67         UTIL_VECTOR_FOREACH_ALL(this->spawns, Arena_Spawn, spawn) 
     67        UTIL_PTR_VECTOR_FOREACH(this->spawns, Arena_Spawn, spawn) 
    6868        { 
    69                 UTIL_LIST_FOREACH_ALL(this->map->characters, Character *, character) 
     69                UTIL_PTR_LIST_FOREACH(this->map->characters, Character, character) 
    7070                { 
    71                         if (character->x == spawn.sx && character->y == spawn.sy) 
     71                        if (character->x == spawn->sx && character->y == spawn->sy) 
    7272                        { 
    7373                                character->next_arena = this; 
    7474                                character->arena_kills = 0; 
    75                                 character->Warp(this->map->id, spawn.dx, spawn.dy); 
     75                                character->Warp(this->map->id, spawn->dx, spawn->dy); 
    7676                                break; 
    7777                        } 
     
    8282        builder.AddChar(newplayers); 
    8383 
    84         UTIL_LIST_FOREACH_ALL(this->map->characters, Character *, character) 
     84        UTIL_PTR_LIST_FOREACH(this->map->characters, Character, character) 
    8585        { 
    8686                character->player->client->SendBuilder(builder); 
     
    112112        } 
    113113 
    114         UTIL_LIST_FOREACH_ALL(this->map->characters, Character *, character) 
     114        UTIL_PTR_LIST_FOREACH(this->map->characters, Character, character) 
    115115        { 
    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) 
    117120                { 
    118121                        ++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); 
    120123 
    121124                        PacketBuilder builder(PACKET_ARENA, PACKET_SPEC); 
     
    128131                        builder.AddByte(255); 
    129132                        builder.AddBreakString(from->name); 
    130                         builder.AddBreakString(character->name); 
     133                        builder.AddBreakString(character_ptr->name); 
    131134 
    132                         UTIL_LIST_FOREACH_ALL(this->map->characters, Character *, character) 
     135                        UTIL_PTR_LIST_FOREACH(this->map->characters, Character, character) 
    133136                        { 
    134137                                character->player->client->SendBuilder(builder); 
     
    143146                                builder.AddBreakString(from->name); 
    144147 
    145                                 UTIL_LIST_FOREACH_ALL(this->map->characters, Character *, character) 
     148                                UTIL_PTR_LIST_FOREACH(this->map->characters, Character, character) 
    146149                                { 
    147150                                        character->player->client->SendBuilder(builder); 
     
    149152                        } 
    150153 
     154                        character_ptr->Release(); 
    151155                        break; 
    152156                } 
     157 
     158                character_ptr->Release(); 
    153159        } 
    154160} 
  • eoserv/trunk/src/arena.hpp

    r168 r171  
    1010#include "stdafx.h" 
    1111 
    12 struct Arena_Spawn 
     12struct Arena_Spawn : public Shared 
    1313{ 
    1414        unsigned char sx; 
     
    1616        unsigned char dx; 
    1717        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() 
    1825}; 
    1926 
    20 class Arena 
     27class Arena : public Shared 
    2128{ 
    2229        public: 
     
    2734                Timer *spawn_timer; 
    2835                Map *map; 
    29                 std::vector<Arena_Spawn> spawns; 
     36                PtrVector<Arena_Spawn> spawns; 
    3037 
    3138                Arena(Map *map, int time, int block); 
     
    3441 
    3542                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() 
    3654}; 
    3755 
  • eoserv/trunk/src/character.cpp

    r168 r171  
    2020 
    2121// TODO: Clean up these functions 
    22 std::string ItemSerialize(std::list<Character_Item> list) 
     22std::string ItemSerialize(const PtrList<Character_Item> &list) 
    2323{ 
    2424        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)); 
    3029                serialized.append(","); 
    31                 serialized.append(util::to_string(item.amount)); 
     30                serialized.append(util::to_string(it->amount)); 
    3231                serialized.append(";"); 
    3332        } 
    3433 
    35         serialized.reserve(0); // Clean up the reserve to save memory 
    3634        return serialized; 
    3735} 
    3836 
    39 std::list<Character_Item> ItemUnserialize(std::string serialized) 
    40 { 
    41         std::list<Character_Item> list; 
     37PtrList<Character_Item> ItemUnserialize(std::string serialized) 
     38{ 
     39        PtrList<Character_Item> list; 
    4240        std::size_t p = 0; 
    4341        std::size_t lastp = std::numeric_limits<std::size_t>::max(); 
    44         Character_Item newitem; 
    4542 
    4643        if (!serialized.empty() && *(serialized.end()-1) != ';') 
     
    5451                std::size_t pp = 0; 
    5552                pp = part.find_first_of(',', 0); 
     53 
    5654                if (pp == std::string::npos) 
    5755                { 
    5856                        continue; 
    5957                } 
    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)); 
    6262 
    6363                list.push_back(newitem); 
     64                newitem->Release(); 
    6465 
    6566                lastp = p; 
     
    7273{ 
    7374        std::string serialized; 
    74  
    75         serialized.reserve(15*5); // Reserve some space to stop some mass-reallocations 
    7675 
    7776        UTIL_ARRAY_FOREACH_ALL(list, int, 15, item) 
     
    8079                serialized.append(","); 
    8180        } 
    82  
    83         serialized.reserve(0); // Clean up the reserve to save memory 
    8481 
    8582        return serialized; 
     
    252249} 
    253250 
     251void 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 
    254260bool Character::Walk(Direction direction) 
    255261{ 
     
    284290int Character::HasItem(short item) 
    285291{ 
    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) 
    289295                { 
    290296                        if (this->trading) 
    291297                        { 
    292                                 UTIL_LIST_FOREACH_ALL(this->trade_inventory, Character_Item, tit) 
     298                                UTIL_PTR_LIST_FOREACH(this->trade_inventory, Character_Item, tit) 
    293299                                { 
    294                                         if (tit.id == item) 
     300                                        if (tit->id == item) 
    295301                                        { 
    296                                                 return std::max(it.amount - tit.amount, 0); 
     302                                                return std::max(it->amount - tit->amount, 0); 
    297303                                        } 
    298304                                } 
    299305 
    300                                 return it.amount; 
     306                                return it->amount; 
    301307                        } 
    302308                        else 
    303309                        { 
    304                                 return it.amount; 
     310                                return it->amount; 
    305311                        } 
    306312                } 
     
    312318bool Character::AddItem(short item, int amount) 
    313319{ 
    314         Character_Item newitem; 
    315  
    316320        if (amount <= 0) 
    317321        { 
     
    324328        } 
    325329 
    326         UTIL_LIST_IFOREACH_ALL(this->inventory, Character_Item, it) 
     330        UTIL_PTR_LIST_FOREACH(this->inventory, Character_Item, it) 
    327331        { 
    328332                if (it->id == item) 
     
    341345        } 
    342346 
    343         newitem.id = item; 
    344         newitem.amount = amount; 
     347        Character_Item *newitem = new Character_Item; 
     348        newitem->id = item; 
     349        newitem->amount = amount; 
    345350 
    346351        this->inventory.push_back(newitem); 
     352        newitem->Release(); 
    347353        this->CalculateStats(); 
    348354        return true; 
     
    356362        } 
    357363 
    358         UTIL_LIST_IFOREACH_ALL(this->inventory, Character_Item, it) 
     364        UTIL_PTR_LIST_FOREACH(this->inventory, Character_Item, it) 
    359365        { 
    360366                if (it->id == item) 
     
    377383} 
    378384 
     385void 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 
    379404bool Character::AddTradeItem(short item, int amount) 
    380405{ 
    381         Character_Item newitem; 
    382  
    383406        if (amount <= 0) 
    384407        { 
     
    398421        } 
    399422 
    400         UTIL_LIST_IFOREACH_ALL(this->trade_inventory, Character_Item, it) 
     423        UTIL_PTR_LIST_FOREACH(this->trade_inventory, Character_Item, it) 
    401424        { 
    402425                if (it->id == item) 
     
    407430        } 
    408431 
    409         newitem.id = item; 
    410         newitem.amount = amount; 
     432        Character_Item *newitem = new Character_Item; 
     433        newitem->id = item; 
     434        newitem->amount = amount; 
    411435 
    412436        this->trade_inventory.push_back(newitem); 
     437        newitem->Release(); 
    413438        return true; 
    414439} 
     
    416441bool Character::DelTradeItem(short item) 
    417442{ 
    418         UTIL_LIST_IFOREACH_ALL(this->trade_inventory, Character_Item, it) 
     443        for (PtrList<Character_Item>::Iterator it(this->trade_inventory); it; ++it) 
    419444        { 
    420445                if (it->id == item) 
     
    426451 
    427452        return false; 
     453 
    428454} 
    429455 
     
    441467                        if (((i == Character::Ring2 || i == Character::Armlet2 || i == Character::Bracer2) ? 1 : 0) == subloc) 
    442468                        { 
     469 
    443470                                this->paperdoll[i] = 0; 
    444471                                this->AddItem(item, 1); 
     
    646673} 
    647674 
    648 bool Character::InRange(Map_Item other) 
     675bool Character::InRange(Map_Item *other) 
    649676{ 
    650677        if (this->nowhere) 
     
    653680        } 
    654681 
    655         return this->InRange(other.x, other.y); 
     682        return this->InRange(other->x, other->y); 
    656683} 
    657684 
     
    732759        PacketBuilder builder; 
    733760 
    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); 
    759786                } 
    760787        } 
     
    764791        builder.AddByte(255); 
    765792 
    766         UTIL_VECTOR_FOREACH_ALL(updatecharacters, Character *, character) 
     793        UTIL_PTR_VECTOR_FOREACH(updatecharacters, Character, character) 
    767794        { 
    768795                builder.AddBreakString(character->name); 
     
    798825        } 
    799826 
    800         UTIL_VECTOR_FOREACH_ALL(updatenpcs, NPC *, npc) 
     827        UTIL_PTR_VECTOR_FOREACH(updatenpcs, NPC, npc) 
    801828        { 
    802829                if (npc->alive) 
     
    812839        builder.AddByte(255); 
    813840 
    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); 
    821848        } 
    822849 
     
    838865        int recent_post_count = 0; 
    839866 
    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) 
    841868        { 
    842869                if (post->author == this->player->character->name) 
     
    853880        int posts_remaining = std::min(static_cast<int>(this->world->config["BoardMaxUserPosts"]) - post_count, static_cast<int>(this->world->config["BoardMaxUserRecentPosts"]) - recent_post_count); 
    854881 
    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) 
    856883        { 
    857884                builder.AddShort(post->id); 
     
    935962        this->armor = 0; 
    936963        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 
    941970        UTIL_ARRAY_FOREACH_ALL(this->paperdoll, int, 15, i) 
    942971        { 
     
    9781007{ 
    9791008        // 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) 
    9841012                { 
    9851013                        continue; 
    9861014                } 
    9871015 
    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); 
    9901017 
    9911018                if (map_item) 
     
    9991026                        { 
    10001027                                map_item->owner = this->player->id; 
     1028                                Console::Dbg("ProtectDeathDrop = %g\n", static_cast<double>(this->world->config["ProtectDeathDrop"])); 
    10011029                                map_item->unprotecttime = Timer::GetTime() + static_cast<double>(this->world->config["ProtectDeathDrop"]); 
    10021030                        } 
    10031031 
    10041032                        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); 
    10071035                        builder.AddInt(0); 
    10081036                        builder.AddShort(map_item->uid); 
     
    10141042                } 
    10151043 
    1016                 goto restart_loop; 
     1044                this->DelItem(item, item->amount); 
    10171045        } 
    10181046 
     
    10951123} 
    10961124 
     1125void 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 
    10971182void Character::Save() 
    10981183{ 
    1099  
    11001184#ifdef DEBUG 
    11011185        Console::Dbg("Saving character '%s' (session lasted %i minutes)", this->name.c_str(), int(std::time(0) - this->login_time) / 60); 
     
    11151199Character::~Character() 
    11161200{ 
    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  
    99 
    1010#include "stdafx.h" 
     11#include "guild.hpp" 
     12#include "script.hpp" 
    1113 
    1214/** 
    1315 * Serialize a list of items in to a text format that can be restored with ItemUnserialize 
    1416 */ 
    15 std::string ItemSerialize(std::list<Character_Item> list); 
     17std::string ItemSerialize(const PtrList<Character_Item> &list); 
    1618 
    1719/** 
    1820 * Convert a string generated by ItemSerialze back to a list of items 
    1921 */ 
    20 std::list<Character_Item> ItemUnserialize(std::string serialized); 
     22PtrList<Character_Item> ItemUnserialize(std::string serialized); 
    2123 
    2224/** 
     
    3335 * One type of item in a Characters inventory 
    3436 */ 
    35 struct Character_Item 
     37struct Character_Item : public Shared 
    3638{ 
    3739        short id; 
    3840        int amount; 
     41 
     42        SCRIPT_REGISTER_REF_DF(Character_Item) 
     43 
     44        SCRIPT_REGISTER_END() 
    3945}; 
    4046 
     
    4248 * One spell that a Character knows 
    4349 */ 
    44 struct Character_Spell 
     50struct Character_Spell : public Shared 
    4551{ 
    4652        short id; 
    4753        unsigned char level; 
     54 
     55        SCRIPT_REGISTER_REF_DF(Character_Spell) 
     56 
     57        SCRIPT_REGISTER_END() 
    4858}; 
    4959 
    50 class Character 
     60class Character : public Shared 
    5161{ 
    5262        public: 
     
    93103                Character *trade_partner; 
    94104                bool trade_agree; 
    95                 std::list<Character_Item> trade_inventory; 
     105                PtrList<Character_Item> trade_inventory; 
    96106 
    97107                Character *party_trust_send; 
     
    123133                }; 
    124134 
    125                 std::list<Character_Item> inventory; 
    126                 std::list<Character_Item> bank; 
     135                PtrList<Character_Item> inventory; 
     136                PtrList<Character_Item> bank; 
    127137                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; 
    130140 
    131141                Character(std::string name, World *); 
     
    134144 
    135145                void Msg(Character *from, std::string message); 
     146                void ServerMsg(std::string message); 
    136147                bool Walk(Direction direction); 
    137148                bool AdminWalk(Direction direction); 
     
    143154                bool AddItem(short item, int amount); 
    144155                bool DelItem(short item, int amount); 
     156                void DelItem(PtrList<Character_Item>::Iterator &, int amount); 
    145157                bool AddTradeItem(short item, int amount); 
    146158                bool DelTradeItem(short item); 
     
    150162                bool InRange(Character *); 
    151163                bool InRange(NPC *); 
    152                 bool InRange(Map_Item); 
     164                bool InRange(Map_Item *); 
    153165                void Warp(short map, unsigned char x, unsigned char y, WarpAnimation animation = WARP_ANIMATION_NONE); 
    154166                void Refresh(); 
     
    159171                void DropAll(Character *killer); 
    160172 
     173                void Logout(); 
    161174                void Save(); 
    162175 
     
    170183                Party *party; 
    171184                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() 
    172293}; 
    173294 
  • eoserv/trunk/src/config.hpp

    r168 r171  
    4545                 */ 
    4646                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() 
    4751}; 
    4852 
  • eoserv/trunk/src/console.cpp

    r168 r171  
    88 
    99#include <cstdio> 
     10#include <cstdarg> 
    1011 
    1112#if defined(WIN32) || defined(WIN64) 
  • eoserv/trunk/src/console.hpp

    r168 r171  
    88#define CONSOLE_HPP_INCLUDED 
    99 
     10#include "fwd/console.hpp" 
     11 
    1012#include <string> 
     13 
     14#include "script.hpp" 
    1115 
    1216namespace Console 
     
    5256void Dbg(std::string f, ...); 
    5357 
     58inline 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 
    5466} 
    5567 
  • eoserv/trunk/src/database.cpp

    r168 r171  
    3939        } 
    4040 
    41         ((Database *)data)->callbackdata.push_back(result); 
     41        static_cast<Database *>(data)->callbackdata.push_back(result); 
    4242        return 0; 
    4343} 
     
    104104                                throw Database_OpenFailed(mysql_error(this->mysql_handle)); 
    105105                        } 
     106 
    106107                        this->connected = true; 
     108 
    107109                        break; 
    108110#endif // DATABASE_MYSQL 
     
    114116                                throw Database_OpenFailed(sqlite3_errmsg(this->sqlite_handle)); 
    115117                        } 
     118 
    116119                        this->connected = true; 
     120 
    117121                        break; 
    118122#endif // DATABASE_SQLITE 
     
    131135 
    132136        this->connected = false; 
     137 
    133138        switch (this->engine) 
    134139        { 
     
    156161        va_list ap; 
    157162        va_start(ap, format); 
     163 
    158164        std::string finalquery; 
    159165        int tempi; 
     
    164170        for (const char *p = format; *p != '\0'; ++p) 
    165171        { 
    166                 if (*p == '#'){ 
     172                if (*p == '#') 
     173                { 
    167174                        tempi = va_arg(ap,int); 
    168175                        finalquery += util::to_string(tempi); 
    169                 } else if (*p == '@'){ 
     176                } 
     177                else if (*p == '@') 
     178                { 
    170179                        tempc = va_arg(ap,char *); 
    171180                        finalquery += static_cast<std::string>(tempc); 
    172                 } else if (*p == '$'){ 
     181                } 
     182                else if (*p == '$') 
     183                { 
    173184                        tempc = va_arg(ap,char *); 
    174185                        switch (this->engine) 
     
    192203#endif // DATABASE_SQLITE 
    193204                        } 
    194                 } else { 
     205                } 
     206                else 
     207                { 
    195208                        finalquery += *p; 
    196209                } 
    197210        } 
     211 
    198212        va_end(ap); 
    199213 
     
    215229                        { 
    216230                                int myerr = mysql_errno(this->mysql_handle); 
     231 
    217232                                if (myerr == CR_SERVER_GONE_ERROR || myerr == CR_SERVER_LOST) 
    218233                                { 
  • eoserv/trunk/src/database.hpp

    r168 r171  
    163163                 */ 
    164164                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() 
    165175}; 
    166176 
  • eoserv/trunk/src/eoclient.cpp

    r168 r171  
    132132void EOClient::SendBuilder(PacketBuilder &builder) 
    133133{ 
    134         std::string packet = static_cast<std::string >(builder); 
     134        std::string packet(builder); 
    135135        this->Send(this->processor.Encode(packet)); 
    136136} 
     
    140140        if (this->player) 
    141141        { 
    142                 delete this->player; // Player handles removing himself from the world 
     142                this->player->Logout(); 
    143143        } 
    144144} 
  • eoserv/trunk/src/eoclient.hpp

    r168 r171  
    1010#include "stdafx.h" 
    1111 
     12#include "eoserver.hpp" 
    1213#include "packet.hpp" 
    1314#include "socket.hpp" 
     
    8687                PacketProcessor processor; 
    8788 
    88                 EOClient(void *void_server) : Client(void_server), server(static_cast<EOServer *>(void_server)) 
     89                EOClient(EOServer *server_) : Client(server_), server(server_) 
    8990                { 
    9091                        this->Initialize(); 
    9192                } 
    9293 
    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_) 
    9495                { 
    9596                        this->Initialize(); 
     
    141142#endif // DOXYGEN 
    142143 
    143                 virtual ~EOClient(); 
     144                ~EOClient(); 
    144145}; 
    145146 
  • eoserv/trunk/src/eoconst.hpp

    r168 r171  
    186186}; 
    187187 
     188namespace eoconst 
     189{ 
     190inline 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} 
    188308 
    189309#endif // EOCONST_HPP_INCLUDED 
  • eoserv/trunk/src/eodata.cpp

    r168 r171  
    3939 
    4040        unsigned char namesize; 
    41         char *namebuf; 
    4241        std::string name; 
    4342        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; 
    4947 
    5048        SAFE_READ(static_cast<void *>(&namesize), sizeof(char), 1, fh); 
    5149        for (int i = 1; i <= numobj; ++i) 
    5250        { 
     51                EIF_Data *newdata = new EIF_Data; 
     52 
    5353                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); 
    5856                SAFE_READ(buf, sizeof(char), EIF::DATA_SIZE, fh); 
    5957 
    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])); 
    6664                // 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; 
    7068                } 
    7169                // / 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]); 
    9391 
    9492                this->data[i] = newdata; 
     
    10098        } 
    10199 
    102         if (newdata.name.compare("eof") == 0) 
     100        if (this->data.back()->name.compare("eof") == 0) 
    103101        { 
    104102                this->data.pop_back(); 
     
    114112        if (id > 0 && id < this->data.size()) 
    115113        { 
    116                 return &this->data[id]; 
     114                return this->data[id]; 
    117115        } 
    118116        else 
    119117        { 
    120                 return &this->data[0]; 
     118                return this->data[0]; 
    121119        } 
    122120} 
     
    140138 
    141139        unsigned char namesize; 
    142         char *namebuf; 
    143140        std::string name; 
    144141        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; 
    150146 
    151147        SAFE_READ(static_cast<void *>(&namesize), sizeof(char), 1, fh); 
    152148        for (int i = 1; i <= numobj; ++i) 
    153149        { 
     150                ENF_Data *newdata = new ENF_Data; 
     151 
    154152                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); 
    159155                SAFE_READ(buf, sizeof(char), ENF::DATA_SIZE, fh); 
    160156 
    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]); 
    179175 
    180176                this->data[i] = newdata; 
     
    186182        } 
    187183 
    188         if (newdata.name.compare("eof") == 0) 
     184        if (this->data.back()->name.compare("eof") == 0) 
    189185        { 
    190186                this->data.pop_back(); 
     
    200196        if (id > 0 && id < this->data.size()) 
    201197        { 
    202                 return &this->data[id]; 
     198                return this->data[id]; 
    203199        } 
    204200        else 
    205201        { 
    206                 return &this->data[0]; 
     202                return this->data[0]; 
    207203        } 
    208204} 
     
    226222 
    227223        unsigned char namesize, shoutsize; 
    228         char *namebuf, *shoutbuf; 
    229224        std::string name, shout; 
    230225        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; 
    236230 
    237231        SAFE_READ(static_cast<void *>(&namesize), sizeof(char), 1, fh); 
     
    239233        for (int i = 1; i <= numobj; ++i) 
    240234        { 
     235                ESF_Data *newdata = new ESF_Data; 
     236 
    241237                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                } 
    246243 
    247244                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                } 
    252250 
    253251                SAFE_READ(buf, sizeof(char), ESF::DATA_SIZE, fh); 
    254252 
    255                 newdata.id = i; 
    256                 newdata.name = name; 
    257                 newdata.shout = shout; 
     253                newdata->id = i; 
     254                newdata->name = name; 
     255                newdata->shout = shout; 
    258256 
    259257                this->data[i] = newdata; 
     
    270268        } 
    271269 
    272         if (this->data[numobj-1].name.compare("eof") == 0) 
     270        if (this->data.back()->name.compare("eof") == 0) 
    273271        { 
    274272                this->data.pop_back(); 
     
    298296 
    299297        unsigned char namesize; 
    300         char *namebuf; 
    301298        std::string name; 
    302299        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; 
    308304 
    309305        SAFE_READ(static_cast<void *>(&namesize), sizeof(char), 1, fh); 
    310306        for (int i = 1; i <= numobj; ++i) 
    311307        { 
     308                ECF_Data *newdata = new ECF_Data; 
     309 
    312310                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 
    317314                SAFE_READ(buf, sizeof(char), ECF::DATA_SIZE, fh); 
    318315 
    319                 newdata.id = i; 
    320                 newdata.name = name; 
     316                newdata->id = i; 
     317                newdata->name = name; 
    321318 
    322319                this->data[i] = newdata; 
     
    328325        } 
    329326 
    330         if (newdata.name.compare("eof") == 0) 
     327        if (this->data.back()->name.compare("eof") == 0) 
    331328        { 
    332329                this->data.pop_back(); 
  • eoserv/trunk/src/eodata.hpp

    r168 r171  
    1313 * Loads and stores information on all items from an EIF file 
    1414 */ 
    15 class EIF 
     15class EIF : public Shared 
    1616{ 
    1717        public: 
     
    7272                unsigned char rid[4]; 
    7373                unsigned char len[2]; 
    74                 std::vector<EIF_Data> data; 
     74                PtrVector<EIF_Data> data; 
    7575                EIF(std::string filename); 
    7676 
    7777                EIF_Data *Get(unsigned int id); 
     78 
     79                SCRIPT_REGISTER_REF(EIF) 
     80 
     81                SCRIPT_REGISTER_END() 
    7882}; 
    7983 
     
    8185 * One item record in an EIF object 
    8286 */ 
    83 struct EIF_Data 
     87struct EIF_Data : public Shared 
    8488{ 
    8589        int id; 
     
    136140 * Loads and stores information on all NPCs from an ENF file 
    137141 */ 
    138 class ENF 
     142class ENF : public Shared 
    139143{ 
    140144        public: 
     
    161165                unsigned char rid[4]; 
    162166                unsigned char len[2]; 
    163                 std::vector<ENF_Data> data; 
     167                PtrVector<ENF_Data> data; 
    164168                ENF(std::string filename); 
    165169 
    166170                ENF_Data *Get(unsigned int id); 
     171 
     172                SCRIPT_REGISTER_REF(ENF) 
     173 
     174                SCRIPT_REGISTER_END() 
    167175}; 
    168176 
     
    170178 * One NPC record in an ENF object 
    171179 */ 
    172 struct ENF_Data 
     180struct ENF_Data : public Shared 
    173181{ 
    174182        int id; 
     
    195203 * Loads and stores information on all spells from an ESF file 
    196204 */ 
    197 class ESF 
     205class ESF : public Shared 
    198206{ 
    199207        public: 
     
    201209                unsigned char rid[4]; 
    202210                unsigned char len[2]; 
    203                 std::vector<ESF_Data> data; 
     211                PtrVector<ESF_Data> data; 
    204212                ESF(std::string filename); 
    205213 
     214                SCRIPT_REGISTER_REF(ESF) 
     215 
     216                SCRIPT_REGISTER_END() 
    206217}; 
    207218 
     
    209220 * One spell record in an ESF object 
    210221 */ 
    211 struct ESF_Data 
     222struct ESF_Data : public Shared 
    212223{ 
    213224        int id; 
     
    221232 * Loads and stores information on all classes from an ECF file 
    222233 */ 
    223 class ECF 
     234class ECF : public Shared 
    224235{ 
    225236        public: 
     
    227238                unsigned char rid[4]; 
    228239                unsigned char len[2]; 
    229                 std::vector<ECF_Data> data; 
     240                PtrVector<ECF_Data> data; 
    230241                ECF(std::string filename); 
    231242 
     243        SCRIPT_REGISTER_REF(ECF) 
     244 
     245        SCRIPT_REGISTER_END() 
    232246}; 
    233247 
     
    235249 * One class record in an ECF object 
    236250 */ 
    237 struct ECF_Data 
     251struct ECF_Data : public Shared 
    238252{ 
    239253        int id; 
  • eoserv/trunk/src/eoserver.cpp

    r168 r171  
    3636        builder.AddChar(0); 
    3737 
    38         UTIL_LIST_FOREACH_ALL(server->clients, EOClient *, client) 
     38        UTIL_PTR_LIST_FOREACH(server->clients, EOClient, client) 
    3939        { 
    4040                if (client->needpong) 
     
    5555        double now = Timer::GetTime(); 
    5656 
    57         UTIL_LIST_FOREACH_ALL(server->clients, EOClient *, client) 
     57        UTIL_PTR_LIST_FOREACH(server->clients, EOClient, client) 
    5858        { 
    5959                std::size_t size = client->queue.size(); 
     
    124124} 
    125125 
     126Client *EOServer::ClientFactory(SOCKET sock, sockaddr_in sin) 
     127{ 
     128        return new EOClient(sock, sin, this); 
     129} 
     130 
    126131void EOServer::Initialize(util::array<std::string, 5> dbinfo, const Config &eoserv_config, const Config &admin_config) 
    127132{ 
     
    146151        if (this->sln) 
    147152        { 
    148                 delete this->sln; 
     153                this->sln->Release(); 
    149154        } 
    150155 
    151         delete this->world; 
     156        this->world->Release(); 
    152157} 
  • eoserv/trunk/src/eoserver.hpp

    r168 r171  
    1010#include "stdafx.h" 
    1111 
    12 #include "eoclient.hpp" 
    1312#include "socket.hpp" 
    1413 
     
    1918 * A server which accepts connections and creates EOClient instances from them 
    2019 */ 
    21 class EOServer : public Server<EOClient> 
     20class EOServer : public Server 
    2221{ 
    2322        private: 
     
    2524                SLN *sln; 
    2625 
     26        protected: 
     27                Client *ClientFactory(SOCKET sock, sockaddr_in sin); 
     28 
    2729        public: 
    2830                World *world; 
    2931 
    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) 
    3133                { 
    3234                        this->Initialize(dbinfo, eoserv_config, admin_config); 
     
    3436 
    3537                ~EOServer(); 
     38 
     39        SCRIPT_REGISTER_REF(EOServer) 
     40 
     41        SCRIPT_REGISTER_END() 
    3642}; 
    3743 
  • eoserv/trunk/src/fwd/socket.hpp

    r168 r171  
    1010class IPAddress; 
    1111class Client; 
    12 template <class> class Server; 
     12class Server; 
    1313 
    1414/** 
  • eoserv/trunk/src/fwd/timer.hpp

    r168 r171  
    1212struct TimeEvent; 
    1313 
     14typedef void(*TimerCallback)(void *); 
     15 
    1416#endif // FWD_TIMER_HPP_INCLUDED 
  • eoserv/trunk/src/guild.hpp

    r168 r171  
    1414 * Created by the World object when a member of the guild logs in, and destroyed when the last member logs out 
    1515 */ 
    16 class Guild 
     16class Guild : public Shared 
    1717{ 
    1818        public: 
    1919                std::string tag; 
    2020                std::string name; 
    21                 std::vector<Character *> members; 
     21                PtrVector<Character> members; 
    2222                util::array<std::string, 9> ranks; 
    2323                std::time_t created; 
    2424 
    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() 
    2630}; 
    2731 
  • eoserv/trunk/src/handlers/Account.cpp

    r168 r171  
    1818                        std::string username = reader.GetEndString(); 
    1919 
    20                         util::lowercase(username); 
     20                        username = util::lowercase(username); 
    2121 
    2222                        reply.SetID(PACKET_ACCOUNT, PACKET_REPLY); 
     
    5555                        int hdid = util::to_int(reader.GetBreakString()); 
    5656 
    57                         util::lowercase(username); 
     57                        username = util::lowercase(username); 
    5858 
    5959                        reply.SetID(PACKET_ACCOUNT, PACKET_REPLY); 
     
    7070                        else 
    7171                        { 
    72                                 util::lowercase(username); 
     72                                username = util::lowercase(username); 
    7373 
    7474                                this->server->world->CreatePlayer(username, password, fullname, location, email, computer, util::to_string(hdid), static_cast<std::string>(this->GetRemoteAddr())); 
     
    121121                        CLIENT_SEND(reply); 
    122122 
    123                         delete changepass; 
     123                        changepass->Release(); 
    124124                } 
    125125                break; 
  • eoserv/trunk/src/handlers/Bank.cpp

    r168 r171  
    2323                        short id = reader.GetShort(); 
    2424 
    25                         UTIL_VECTOR_FOREACH_ALL(this->player->character->map->npcs, NPC *, npc) 
     25                        UTIL_PTR_VECTOR_FOREACH(this->player->character->map->npcs, NPC, npc) 
    2626                        { 
    2727                                if (npc->index == id && npc->data->type == ENF::Bank) 
    2828                                { 
    29                                         this->player->character->bank_npc = npc; 
     29                                        this->player->character->bank_npc = *npc; 
    3030 
    3131                                        reply.SetID(PACKET_BANK, PACKET_OPEN); 
  • eoserv/trunk/src/handlers/Board.cpp

    r168 r171  
    3232                        } 
    3333 
    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) 
    3535                        { 
    36                                 if ((*post)->id == postid) 
     36                                if (post->id == postid) 
    3737                                { 
    38                                         if ((*post)->author_admin < this->player->character->admin 
    39                                          || (*post)->author == this->player->character->name) 
     38                                        if (post->author_admin < this->player->character->admin 
     39                                         || post->author == this->player->character->name) 
    4040                                        { 
    4141                                                this->server->world->boards[boardid]->posts.erase(post); 
     
    7878                        int recent_post_count = 0; 
    7979 
    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) 
    8181                        { 
    8282                                if (post->author == this->player->character->name) 
     
    137137                        } 
    138138 
    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) 
    140140                        { 
    141141                                if (post->id == postid) 
  • eoserv/trunk/src/handlers/Chair.cpp

    r168 r171  
    3131                                } 
    3232 
    33                                 UTIL_LIST_FOREACH_ALL(this->player->character->map->characters, Character *, character) 
     33                                UTIL_PTR_LIST_FOREACH(this->player->character->map->characters, Character, character) 
    3434                                { 
    3535                                        if (character->x == x && character->y == y) 
  • eoserv/trunk/src/handlers/Character.cpp

    r168 r171  
    3838                        reader.GetByte(); 
    3939                        std::string name = reader.GetBreakString(); 
    40                         util::lowercase(name); 
     40                        name = util::lowercase(name); 
    4141 
    4242                        if (gender != GENDER_MALE && gender != GENDER_FEMALE) return false; 
     
    6868                                reply.AddByte(1); // ?? 
    6969                                reply.AddByte(255); 
    70                                 UTIL_VECTOR_FOREACH_ALL(this->player->characters, Character *, character) 
     70                                UTIL_PTR_VECTOR_FOREACH(this->player->characters, Character, character) 
    7171                                { 
    7272                                        reply.AddBreakString(character->name); 
     
    100100 
    101101                        bool yourchar = false; 
    102                         std::vector<Character *>::iterator char_it; 
     102                        PtrVector<Character>::Iterator char_it(this->player->characters); 
    103103 
    104                         UTIL_VECTOR_IFOREACH(this->player->characters.begin(), this->player->characters.end(), Character *, character) 
     104                        UTIL_PTR_VECTOR_FOREACH(this->player->characters, Character, character) 
    105105                        { 
    106                                 if ((*character)->id == charid) 
     106                                if (character->id == charid) 
    107107                                { 
    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); 
    110110                                        char_it = character; 
    111111                                        yourchar = true; 
     
    126126                        reply.AddByte(1); // ?? 
    127127                        reply.AddByte(255); 
    128                         UTIL_VECTOR_FOREACH_ALL(this->player->characters, Character *, character) 
     128                        UTIL_PTR_VECTOR_FOREACH(this->player->characters, Character, character) 
    129129                        { 
    130130                                reply.AddBreakString(character->name); 
     
    155155                        bool yourchar = false; 
    156156 
    157                         UTIL_VECTOR_FOREACH_ALL(this->player->characters, Character *, character) 
     157                        UTIL_PTR_VECTOR_FOREACH(this->player->characters, Character, character) 
    158158                        { 
    159159                                if (character->id == charid) 
  • eoserv/trunk/src/handlers/Chest.cpp

    r168 r171  
    3434                                if (this->player->character->map->GetSpec(x, y) == Map_Tile::Chest) 
    3535                                { 
    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) 
    3737                                        { 
    3838                                                if (chest->x == x && chest->y == y) 
     
    4949                                                                reply.AddChar(this->player->character->maxweight); 
    5050 
    51                                                                 UTIL_LIST_FOREACH_ALL(chest->items, Map_Chest_Item, item) 
     51                                                                UTIL_PTR_LIST_FOREACH(chest->items, Map_Chest_Item, item) 
    5252                                                                { 
    53                                                                         if (item.id != 0) 
     53                                                                        if (item->id != 0) 
    5454                                                                        { 
    55                                                                                 reply.AddShort(item.id); 
    56                                                                                 reply.AddThree(item.amount); 
     55                                                                                reply.AddShort(item->id); 
     56                                                                                reply.AddThree(item->amount); 
    5757                                                                        } 
    5858                                                                } 
     
    8080                                if (this->player->character->map->GetSpec(x, y) == Map_Tile::Chest) 
    8181                                { 
    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) 
    8383                                        { 
    8484                                                if (chest->x == x && chest->y == y) 
     
    9797                                                                reply.AddChar(this->player->character->maxweight); 
    9898 
    99                                                                 UTIL_LIST_FOREACH_ALL(chest->items, Map_Chest_Item, item) 
     99                                                                UTIL_PTR_LIST_FOREACH(chest->items, Map_Chest_Item, item) 
    100100                                                                { 
    101                                                                         if (item.id != 0) 
     101                                                                        if (item->id != 0) 
    102102                                                                        { 
    103                                                                                 reply.AddShort(item.id); 
    104                                                                                 reply.AddThree(item.amount); 
     103                                                                                reply.AddShort(item->id); 
     104                                                                                reply.AddThree(item->amount); 
    105105                                                                        } 
    106106                                                                } 
     
    131131                                        reply.AddChar(y); 
    132132 
    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) 
    134134                                        { 
    135135                                                if (chest->x == x && chest->y == y) 
    136136                                                { 
    137                                                         UTIL_LIST_FOREACH_ALL(chest->items, Map_Chest_Item, item) 
     137                                                        UTIL_PTR_LIST_FOREACH(chest->items, Map_Chest_Item, item) 
    138138                                                        { 
    139                                                                 if (item.id != 0) 
     139                                                                if (item->id != 0) 
    140140                                                                { 
    141                                                                         reply.AddShort(item.id); 
    142                                                                         reply.AddThree(item.amount); 
     141                                                                        reply.AddShort(item->id); 
     142                                                                        reply.AddThree(item->amount); 
    143143                                                                } 
    144144                                                        } 
  • eoserv/trunk/src/handlers/Init.cpp

    r168 r171  
    1010{ 
    1111        ++i; 
    12         int a = ((i % 11 + 1) * 119); 
    1312 
    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; 
    2014} 
    2115 
  • eoserv/trunk/src/handlers/Internal.cpp

    r168 r171  
    66 
    77#include "handlers.h" 
     8 
     9#include "map.hpp" 
    810 
    911CLIENT_F_FUNC(Internal) 
  • eoserv/trunk/src/handlers/Item.cpp

    r168 r171  
    9696                                                builder.AddChar(int(double(this->player->character->hp) / double(this->player->character->maxhp) * 100.0)); 
    9797 
    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)) 
    101101                                                        { 
    102102                                                                character->player->client->SendBuilder(builder); 
     
    129129                                                builder.AddChar(item->haircolor); 
    130130 
    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)) 
    134134                                                        { 
    135135                                                                character->player->client->SendBuilder(builder); 
     
    208208                                { 
    209209                                        item->owner = this->player->id; 
    210                                         item->unprotecttime = Timer::GetTime() + static_cast<double>(this->server->world->config["ProctectPlayerDrop"]); 
     210                                        item->unprotecttime = Timer::GetTime() + static_cast<double>(this->server->world->config["ProtectPlayerDrop"]); 
    211211                                        this->player->character->DelItem(id, amount); 
    212212 
     
    254254                        int uid = reader.GetShort(); 
    255255 
    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