Changeset 184

Show
Ignore:
Timestamp:
01/10/10 05:58:12 (8 months ago)
Author:
sausage
Message:

$hide admin command,
$board admin command,
AdminBoard? option (reports/requests are logged here),
Fix boss children not being aggressive after first spawn,
Use blank values for quest and vars database columns,
Proper boss child death packet,
Proper admin report/request packets,
RespawnBossChildren? config option,
Fix guild bank/description saving,
Configurable #nowall admin level

Location:
eoserv/trunk
Files:
18 modified

Legend:

Unmodified
Added
Removed
  • eoserv/trunk/admin.ini

    r174 r184  
    11# This file determines the minimum access level required for admin commands 
    2 # No command should be set to level 0 since the EO client will not allow the 
    3 # commands to be entered at that access level. (unless the prefix is changed) 
    42 
    53# 0 = Player 
     
    4038 
    4139 
    42 ## PLAYER CONTROL COMMANDS ## 
     40## MAP/PLAYER CONTROL COMMANDS ## 
    4341 
    4442# Disconnect a player from the server 
     
    8078warpmeto = 2 
    8179 
     80# Hides the player from maps and the online list 
     81# $hide 
     82hide = 2 
     83 
    8284# Evacuates a map 
    8385# $evacuate 
     
    8890remap = 4 
    8991 
    90 # Reloads pub files 
    91 # $repub 
    92 repub = 4 
    93  
    9492# Forces an arena launch on the current map 
    9593# $arena 
    9694arena = 1 
     95 
     96# Opens any board in the world 
     97# $board [id] 
     98# If no id is given defaults to AdminBoard 
     99board = 1 
    97100 
    98101 
     
    106109# $rehash 
    107110rehash = 4 
     111 
     112# Reloads pub files 
     113# $repub 
     114repub = 4 
    108115 
    109116 
     
    175182boardmod = 1 
    176183 
    177 # Recieve reports 
     184# Recieve reports and allows access to AdminBoard 
    178185reports = 1 
     186 
     187# Allows #nowall (walk through walls) 
     188nowall = 2 
     189 
     190# See hidden players 
     191seehide = 3 
    179192 
    180193 
  • eoserv/trunk/config.ini

    r183 r184  
    337337# Adds "(x minutes ago)" text to every post on a board 
    338338BoardDatePosts = yes 
     339 
     340## AdminBoard (number) 
     341# Board number that reports/requests are logged (1 to 8) 
     342# This board can't be accessed by players if placed in-game 
     343# 0 to disable 
     344AdminBoard = 8 
     345 
     346## AdminBoardLimit (number) 
     347# Maximum number of posts that the AdminBoard can hold 
     348AdminBoardLimit = 100 
    339349 
    340350 
     
    539549JukeboxTimer = 1m30s 
    540550 
     551## RespawnBossChildren (bool) 
     552# Respawns boss children 
     553RespawnBossChildren = yes 
     554 
     555## OldReports (bool) 
     556# Uses the old admin chat report method 
     557OldReports = no 
     558 
    541559 
    542560## RATES ## 
  • eoserv/trunk/src/character.cpp

    r182 r184  
    115115        Database_Result res = this->world->db.Query("SELECT `name`, `title`, `home`, `partner`, `admin`, `class`, `gender`, `race`, `hairstyle`, `haircolor`, `map`," 
    116116        "`x`, `y`, `direction`, `spawnmap`, `spawnx`, `spawny`, `level`, `exp`, `hp`, `tp`, `str`, `int`, `wis`, `agi`, `con`, `cha`, `statpoints`, `skillpoints`, " 
    117         "`karma`, `sitting`, `bankmax`, `goldbank`, `usage`, `inventory`, `bank`, `paperdoll`, `spells`, `guild`, `guild_rank` FROM `characters` WHERE `name` = '$'", name.c_str()); 
     117        "`karma`, `sitting`, `bankmax`, `goldbank`, `usage`, `inventory`, `bank`, `paperdoll`, `spells`, `guild`, `guild_rank`, `quest`, `vars` FROM `characters` " 
     118        "WHERE `name` = '$'", name.c_str()); 
    118119        std::map<std::string, util::variant> row = res.front(); 
    119120 
     
    195196 
    196197        this->sitting = static_cast<SitAction>(GetRow<int>(row, "sitting")); 
     198        this->hidden = false; 
    197199 
    198200        this->bankmax = GetRow<int>(row, "bankmax"); 
     
    764766                builder.AddShort(this->world->eif->Get(character->paperdoll[Character::Weapon])->dollgraphic); 
    765767                builder.AddChar(character->sitting); 
    766                 builder.AddChar(0); // visible 
     768                builder.AddChar(character->hidden); 
    767769                builder.AddByte(255); 
    768770        } 
     
    10781080} 
    10791081 
     1082void Character::Hide() 
     1083{ 
     1084        this->hidden = true; 
     1085 
     1086        PacketBuilder builder(PACKET_ADMININTERACT, PACKET_REMOVE); 
     1087        builder.AddShort(this->player->id); 
     1088 
     1089        UTIL_PTR_LIST_FOREACH(this->map->characters, Character, character) 
     1090        { 
     1091                character->player->client->SendBuilder(builder); 
     1092        } 
     1093} 
     1094 
     1095void Character::Unhide() 
     1096{ 
     1097        this->hidden = false; 
     1098 
     1099        PacketBuilder builder(PACKET_ADMININTERACT, PACKET_AGREE); 
     1100        builder.AddShort(this->player->id); 
     1101 
     1102        UTIL_PTR_LIST_FOREACH(this->map->characters, Character, character) 
     1103        { 
     1104                character->player->client->SendBuilder(builder); 
     1105        } 
     1106} 
     1107 
    10801108#define v(x) vars[prefix + #x] = x; 
    10811109#define vv(x, n) vars[prefix + n] = x; 
     
    11641192                "`str` = #, `int` = #, `wis` = #, `agi` = #, `con` = #, `cha` = #, `statpoints` = #, `skillpoints` = #, `karma` = #, `sitting` = #, " 
    11651193                "`bankmax` = #, `goldbank` = #, `usage` = #, `inventory` = '$', `bank` = '$', `paperdoll` = '$', " 
    1166                 "`spells` = '$', `guild` = '$', guild_rank = # WHERE `name` = '$'", 
     1194                "`spells` = '$', `guild` = '$', guild_rank = #, `quest` = '$', `vars` = '$' WHERE `name` = '$'", 
    11671195                this->title.c_str(), this->home.c_str(), this->partner.c_str(), this->clas, this->gender, this->race, 
    11681196                this->hairstyle, this->haircolor, this->mapid, this->x, this->y, this->direction, this->level, this->exp, this->hp, this->tp, 
    11691197                this->str, this->intl, this->wis, this->agi, this->con, this->cha, this->statpoints, this->skillpoints, this->karma, this->sitting, 
    11701198                this->bankmax, this->goldbank, this->Usage(), ItemSerialize(this->inventory).c_str(), ItemSerialize(this->bank).c_str(), 
    1171                 DollSerialize(this->paperdoll).c_str(), "", (this->guild ? this->guild->tag.c_str() : ""), this->guild_rank, this->name.c_str()); 
     1199                DollSerialize(this->paperdoll).c_str(), "", (this->guild ? this->guild->tag.c_str() : ""), this->guild_rank, "", "", this->name.c_str()); 
    11721200} 
    11731201 
  • eoserv/trunk/src/character.hpp

    r182 r184  
    8888                short karma; 
    8989                SitAction sitting; 
    90                 unsigned char visible; 
     90                bool hidden; 
    9191                int bankmax; 
    9292                int goldbank; 
     
    179179                void CalculateStats(); 
    180180                void DropAll(Character *killer); 
     181                void Hide(); 
     182                void Unhide(); 
    181183 
    182184                void FormulaVars(std::map<std::string, double> &vars, std::string prefix = ""); 
     
    198200        SCRIPT_REGISTER_REF(Character) 
    199201                SCRIPT_REGISTER_FACTORY("Character @f(string name, World @)", ScriptFactory); 
     202 
     203                SCRIPT_REGISTER_ENUM("EquipLocation") 
     204                        SCRIPT_REGISTER_ENUM_VALUE(Boots); 
     205                        SCRIPT_REGISTER_ENUM_VALUE(Accessory); 
     206                        SCRIPT_REGISTER_ENUM_VALUE(Gloves); 
     207                        SCRIPT_REGISTER_ENUM_VALUE(Belt); 
     208                        SCRIPT_REGISTER_ENUM_VALUE(Armor); 
     209                        SCRIPT_REGISTER_ENUM_VALUE(Necklace); 
     210                        SCRIPT_REGISTER_ENUM_VALUE(Hat); 
     211                        SCRIPT_REGISTER_ENUM_VALUE(Shield); 
     212                        SCRIPT_REGISTER_ENUM_VALUE(Weapon); 
     213                        SCRIPT_REGISTER_ENUM_VALUE(Ring1); 
     214                        SCRIPT_REGISTER_ENUM_VALUE(Ring2); 
     215                        SCRIPT_REGISTER_ENUM_VALUE(Armlet1); 
     216                        SCRIPT_REGISTER_ENUM_VALUE(Armlet2); 
     217                        SCRIPT_REGISTER_ENUM_VALUE(Bracer1); 
     218                        SCRIPT_REGISTER_ENUM_VALUE(Bracer2); 
     219                SCRIPT_REGISTER_ENUM_END() 
    200220 
    201221                SCRIPT_REGISTER_VARIABLE("int", login_time); 
     
    236256                SCRIPT_REGISTER_VARIABLE("int16", karma); 
    237257                SCRIPT_REGISTER_VARIABLE("SitAction", sitting); 
    238                 SCRIPT_REGISTER_VARIABLE("uint8", visible); 
     258                SCRIPT_REGISTER_VARIABLE("bool", hidden); 
    239259                SCRIPT_REGISTER_VARIABLE("int", bankmax); 
    240260                SCRIPT_REGISTER_VARIABLE("int", goldbank); 
     
    304324                SCRIPT_REGISTER_FUNCTION("void CalculateStats()", CalculateStats); 
    305325                SCRIPT_REGISTER_FUNCTION("void DropAll(Character @killer)", DropAll); 
     326                SCRIPT_REGISTER_FUNCTION("void Hide()", Hide); 
     327                SCRIPT_REGISTER_FUNCTION("void Unhide()", Unhide); 
     328                SCRIPT_REGISTER_FUNCTION("void Logout()", Logout); 
    306329                SCRIPT_REGISTER_FUNCTION("void Save()", Save); 
    307330 
  • eoserv/trunk/src/eoconst.hpp

    r182 r184  
    117117        INIT_PLAYERS = 8, 
    118118        INIT_MAP_MUTATION = 9, 
    119         INIT_NOISE = 10, 
     119        INIT_FRIEND_LIST_PLAYERS = 10, 
    120120        INIT_FILE_ECF = 11 
    121121}; 
     
    321321                SCRIPT_REGISTER_ENUM_VALUE(INIT_PLAYERS); 
    322322                SCRIPT_REGISTER_ENUM_VALUE(INIT_MAP_MUTATION); 
    323                 SCRIPT_REGISTER_ENUM_VALUE(INIT_NOISE); 
     323                SCRIPT_REGISTER_ENUM_VALUE(INIT_FRIEND_LIST_PLAYERS); 
    324324                SCRIPT_REGISTER_ENUM_VALUE(INIT_FILE_ECF); 
    325325        SCRIPT_REGISTER_ENUM_END() 
  • eoserv/trunk/src/guild.cpp

    r182 r184  
    505505        } 
    506506 
     507        this->Save(); 
     508 
    507509        this->manager->Release(); 
    508510} 
  • eoserv/trunk/src/handlers/AdminInteract.cpp

    r174 r184  
    1919                        std::string message = reader.GetEndString(); 
    2020 
    21                         message = "[Request] " + message; 
    22  
    23                         this->server->world->AdminMsg(this->player->character, message, static_cast<int>(this->server->world->admin_config["reports"])); 
     21                        if (this->server->world->config["OldReports"]) 
     22                        { 
     23                                message = "[Request] " + message; 
     24                                this->server->world->AdminMsg(this->player->character, message, static_cast<int>(this->server->world->admin_config["reports"])); 
     25                        } 
     26                        else 
     27                        { 
     28                                this->server->world->AdminRequest(this->player->character, message); 
     29                        } 
    2430                } 
    2531                break; 
     
    3238                        std::string message = reader.GetEndString(); 
    3339 
    34                         message = "[Report:" + reportee + "] " + message; 
    35  
    36                         this->server->world->AdminMsg(this->player->character, message, static_cast<int>(this->server->world->admin_config["reports"])); 
     40                        if (this->server->world->config["OldReports"]) 
     41                        { 
     42                                message = "[Report:" + reportee + "] " + message; 
     43                                this->server->world->AdminMsg(this->player->character, message, static_cast<int>(this->server->world->admin_config["reports"])); 
     44                        } 
     45                        else 
     46                        { 
     47                                this->server->world->AdminReport(this->player->character, reportee, message); 
     48                        } 
    3749                } 
    3850                break; 
  • eoserv/trunk/src/handlers/Board.cpp

    r181 r184  
    112112                                this->player->character->board->posts.push_front(newpost); 
    113113 
    114                                 if (this->player->character->board->posts.size() > static_cast<std::size_t>(static_cast<int>(this->server->world->config["BoardMaxPosts"]))) 
     114                                if (this->player->character->board->id == static_cast<int>(this->server->world->config["AdminBoard"])) 
    115115                                { 
    116                                         this->player->character->board->posts.pop_back(); 
     116                                        if (this->player->character->board->posts.size() > static_cast<std::size_t>(static_cast<int>(this->server->world->config["AdminBoardLimit"]))) 
     117                                        { 
     118                                                this->player->character->board->posts.pop_back(); 
     119                                        } 
     120                                } 
     121                                else 
     122                                { 
     123                                        if (this->player->character->board->posts.size() > static_cast<std::size_t>(static_cast<int>(this->server->world->config["BoardMaxPosts"]))) 
     124                                        { 
     125                                                this->player->character->board->posts.pop_back(); 
     126                                        } 
    117127                                } 
    118128 
     
    159169                        } 
    160170 
    161                         for (std::size_t y = 0; y < this->player->character->map->height; ++y) 
     171                        if (boardid != static_cast<int>(this->server->world->config["AdminBoard"]) - 1 
     172                         || this->player->character->admin >= static_cast<int>(this->server->world->admin_config["reports"])) 
    162173                        { 
    163                                 for (std::size_t x = 0; x < this->player->character->map->width; ++x) 
     174                                for (std::size_t y = 0; y < this->player->character->map->height; ++y) 
    164175                                { 
    165                                         if (this->player->character->InRange(x, y) 
    166                                          && this->player->character->map->GetSpec(x, y) == static_cast<Map_Tile::TileSpec>(Map_Tile::Board1 + boardid)) 
     176                                        for (std::size_t x = 0; x < this->player->character->map->width; ++x) 
    167177                                        { 
    168                                                 this->player->character->board = this->server->world->boards[boardid]; 
     178                                                if (this->player->character->InRange(x, y) 
     179                                                 && this->player->character->map->GetSpec(x, y) == static_cast<Map_Tile::TileSpec>(Map_Tile::Board1 + boardid)) 
     180                                                { 
     181                                                        this->player->character->board = this->server->world->boards[boardid]; 
     182                                                } 
    169183                                        } 
    170184                                } 
  • eoserv/trunk/src/handlers/Players.cpp

    r171 r184  
    2020                        Character *victim = this->server->world->GetCharacter(name); 
    2121 
    22                         if (victim) 
     22                        if (victim && !victim->hidden) 
    2323                        { 
    2424                                if (victim->mapid == this->player->character->mapid && !victim->nowhere) 
     
    4040                } 
    4141 
     42                case PACKET_LIST: // Opened friends list 
    4243                case PACKET_REQUEST: // Requested a list of online players 
    4344                { 
     45                        int online = this->server->world->characters.size(); 
     46 
     47                        UTIL_PTR_VECTOR_FOREACH(this->server->world->characters, Character, character) 
     48                        { 
     49                                if (character->hidden) 
     50                                { 
     51                                        --online; 
     52                                } 
     53                        } 
     54 
    4455                        reply.SetID(0); 
    45                         reply.AddChar(INIT_PLAYERS); 
    46                         reply.AddShort(this->server->world->characters.size()); 
     56                        reply.AddChar(action == PACKET_LIST ? INIT_FRIEND_LIST_PLAYERS : INIT_PLAYERS); 
     57                        reply.AddShort(online); 
    4758                        reply.AddByte(255); 
    4859                        UTIL_PTR_VECTOR_FOREACH(this->server->world->characters, Character, character) 
    4960                        { 
     61                                if (character->hidden) 
     62                                { 
     63                                        continue; 
     64                                } 
     65 
    5066                                reply.AddBreakString(character->name); 
    5167                                reply.AddBreakString(character->title); 
  • eoserv/trunk/src/handlers/Talk.cpp

    r182 r184  
    9090                        } 
    9191 
    92                         if (to) 
     92                        if (to && !to->hidden) 
    9393                        { 
    9494                                to->Msg(this->player->character, message); 
     
    134134                                                { 
    135135                                                        this->server->world->Kick(this->player->character, victim, command[0] != 's'); 
     136                                                } 
     137                                        } 
     138                                } 
     139                                else if (command.length() >= 2 && command.compare(0,2,"bo") == 0 && this->player->character->admin >= static_cast<int>(this->server->world->admin_config["board"])) 
     140                                { 
     141                                        short boardid = ((arguments.size() >= 1) ? util::to_int(arguments[0]) : static_cast<int>(this->server->world->config["AdminBoard"])) - 1; 
     142 
     143                                        if (boardid != static_cast<int>(this->server->world->config["AdminBoard"]) - 1 
     144                                         || this->player->character->admin >= static_cast<int>(this->server->world->admin_config["reports"])) 
     145                                        { 
     146                                                if (static_cast<std::size_t>(boardid) < this->server->world->boards.size()) 
     147                                                { 
     148                                                        this->player->character->board = this->server->world->boards[boardid]; 
     149                                                        this->player->character->ShowBoard(); 
    136150                                                } 
    137151                                        } 
     
    388402                                        this->player->character->map->Effect(MAP_EFFECT_QUAKE, strength); 
    389403                                } 
     404                                else if (command.length() >= 1 && command.compare(0,1,"h") == 0 && this->player->character->admin >= static_cast<int>(this->server->world->admin_config["hide"])) 
     405                                { 
     406                                        if (this->player->character->hidden) 
     407                                        { 
     408                                                this->player->character->Unhide(); 
     409                                        } 
     410                                        else 
     411                                        { 
     412                                                this->player->character->Hide(); 
     413                                        } 
     414                                } 
    390415                        } 
    391416                        else 
  • eoserv/trunk/src/handlers/Warp.cpp

    r173 r184  
    9898                                reply.AddShort(this->server->world->eif->Get(character->paperdoll[Character::Weapon])->dollgraphic); 
    9999                                reply.AddChar(character->sitting); 
    100                                 reply.AddChar(0); // visible 
     100                                reply.AddChar(character->hidden); 
    101101                                reply.AddByte(255); 
    102102                        } 
  • eoserv/trunk/src/handlers/Welcome.cpp

    r182 r184  
    101101                        reply.AddChar(this->player->character->clas); 
    102102                        reply.AddString(this->player->character->PaddedGuildTag()); 
    103                         // Tell a guardian's client they're a GM so they can use #nowall 
    104                         reply.AddChar((this->player->character->admin == ADMIN_GUARDIAN) ? ADMIN_GM : this->player->character->admin); 
     103 
     104                        // Tell a player's client they're a higher level admin than they are to enable some features 
     105 
     106                        AdminLevel lowest_command = ADMIN_HGM; 
     107 
     108                        UTIL_MAP_FOREACH_ALL(this->server->world->admin_config, std::string, util::variant, ac) 
     109                        { 
     110                                if (ac.first == "killnpc" 
     111                                 || ac.first == "reports") 
     112                                { 
     113                                        continue; 
     114                                } 
     115 
     116                                lowest_command = std::min<AdminLevel>(lowest_command, static_cast<AdminLevel>(util::to_int(ac.second))); 
     117                        } 
     118 
     119                        if (this->player->character->admin >= static_cast<int>(this->server->world->admin_config["seehide"]) 
     120                         && this->player->character->admin < ADMIN_HGM) 
     121                        { 
     122                                reply.AddChar(ADMIN_HGM); 
     123                        } 
     124                        else if (this->player->character->admin >= static_cast<int>(this->server->world->admin_config["nowall"]) 
     125                         && this->player->character->admin < ADMIN_GM) 
     126                        { 
     127                                reply.AddChar(ADMIN_GM); 
     128                        } 
     129                        else if (this->player->character->admin >= lowest_command 
     130                         && this->player->character->admin < ADMIN_GUIDE) 
     131                        { 
     132                                reply.AddChar(ADMIN_GUIDE); 
     133                        } 
     134                        else 
     135                        { 
     136                                reply.AddChar(this->player->character->admin); 
     137                        } 
     138 
    105139                        reply.AddChar(this->player->character->level); 
    106140                        reply.AddInt(this->player->character->exp); 
     
    162196                        reply.AddShort(10); // ? 
    163197                        reply.AddShort(10); // ? 
     198                        reply.AddShort(0); // Admin command flood rate 
    164199                        reply.AddShort(2); // ? 
    165                         reply.AddShort(2); // ? 
    166                         reply.AddChar(4); // ? 
     200                        reply.AddChar(0); // Login warning message 
    167201                        reply.AddByte(255); 
    168202 
     
    317351                                reply.AddShort(this->server->world->eif->Get(character->paperdoll[Character::Weapon])->dollgraphic); 
    318352                                reply.AddChar(character->sitting); 
    319                                 reply.AddChar(0); // visible 
     353                                reply.AddChar(character->hidden); 
    320354                                reply.AddByte(255); 
    321355                        } 
  • eoserv/trunk/src/main.cpp

    r182 r184  
    310310                eoserv_config_default(config, "BoardMaxPostLength" , 2048); 
    311311                eoserv_config_default(config, "BoardDatePosts"     , true); 
     312                eoserv_config_default(config, "AdminBoard"         , 8); 
     313                eoserv_config_default(config, "AdminBoardLimit"    , 100); 
    312314                eoserv_config_default(config, "ShowLevel"          , false); 
    313315                eoserv_config_default(config, "WarpBubbles"        , true); 
     
    384386                eoserv_config_default(config, "JukeboxPrice"       , 25); 
    385387                eoserv_config_default(config, "JukeboxTimer"       , 90); 
     388                eoserv_config_default(config, "RespawnBossChildren", true); 
     389                eoserv_config_default(config, "OldReports"         , false); 
    386390                eoserv_config_default(config, "DoorTimer"          , 3.0); 
    387391                eoserv_config_default(config, "ChatMaxWidth"       , 1500); 
     
    415419                eoserv_config_default(aconfig, "warptome"      , 2); 
    416420                eoserv_config_default(aconfig, "warpmeto"      , 2); 
     421                eoserv_config_default(aconfig, "hide"          , 2); 
    417422                eoserv_config_default(aconfig, "evacuate"      , 2); 
    418423                eoserv_config_default(aconfig, "remap"         , 4); 
    419                 eoserv_config_default(aconfig, "repub"         , 4); 
    420424                eoserv_config_default(aconfig, "arena"         , 1); 
     425                eoserv_config_default(aconfig, "board"         , 1); 
    421426                eoserv_config_default(aconfig, "shutdown"      , 4); 
    422427                eoserv_config_default(aconfig, "rehash"        , 4); 
     428                eoserv_config_default(aconfig, "repub"         , 4); 
    423429                eoserv_config_default(aconfig, "sitem"         , 3); 
    424430                eoserv_config_default(aconfig, "ditem"         , 3); 
     
    453459                eoserv_config_default(aconfig, "boardmod"      , 1); 
    454460                eoserv_config_default(aconfig, "reports"       , 1); 
     461                eoserv_config_default(aconfig, "seehide"       , 4); 
    455462 
    456463                Console::Styled[1] = Console::Styled[0] = config["StyleConsole"]; 
  • eoserv/trunk/src/map.cpp

    r182 r184  
    619619        builder.AddShort(this->world->eif->Get(character->paperdoll[Character::Weapon])->dollgraphic); 
    620620        builder.AddChar(character->sitting); 
    621         builder.AddChar(0); // visible 
     621        builder.AddChar(character->hidden); 
    622622        builder.AddChar(animation); 
    623623        builder.AddByte(255); 
     
    688688        PacketBuilder builder; 
    689689        int seedistance = this->world->config["SeeDistance"]; 
    690  
    691         // TODO: Check for open/closed doors 
    692690 
    693691        unsigned char target_x = from->x; 
     
    933931        builder.AddShort(this->world->eif->Get(from->paperdoll[Character::Weapon])->dollgraphic); 
    934932        builder.AddChar(from->sitting); 
    935         builder.AddChar(0); // visible 
     933        builder.AddChar(from->hidden); 
    936934        builder.AddByte(255); 
    937935        builder.AddChar(1); // 0 = NPC, 1 = player 
     
    970968                rbuilder.AddShort(this->world->eif->Get(character->paperdoll[Character::Weapon])->dollgraphic); 
    971969                rbuilder.AddChar(character->sitting); 
    972                 rbuilder.AddChar(0); // visible 
     970                rbuilder.AddChar(character->hidden); 
    973971                rbuilder.AddByte(255); 
    974972                rbuilder.AddChar(1); // 0 = NPC, 1 = player 
     
    16291627                close->y = y; 
    16301628 
    1631                 TimeEvent *event = new TimeEvent(map_close_door, close, this->world->config["DoorTimer"], 1); // TODO: Make this a config variable 
     1629                TimeEvent *event = new TimeEvent(map_close_door, close, this->world->config["DoorTimer"], 1); 
    16321630                this->world->timer.Register(event); 
    16331631                event->Release(); 
  • eoserv/trunk/src/npc.cpp

    r183 r184  
    5959        } 
    6060 
     61        this->parent = 0; 
     62 
    6163        this->LoadShopDrop(); 
    6264} 
     
    182184                        if (npc->Data()->child) 
    183185                        { 
    184                                 npc->Spawn(*npc); 
    185                         } 
    186                 } 
    187         } 
    188  
    189         this->parent = parent; 
     186                                npc->Spawn(this); 
     187                        } 
     188                } 
     189        } 
     190 
     191        if (parent) 
     192        { 
     193                this->parent = parent; 
     194        } 
    190195 
    191196        if (this->spawn_type < 7) 
     
    311316                                continue; 
    312317                        } 
    313  
    314                         int distance = util::path_length(opponent->attacker->x, opponent->attacker->y, parent->x, parent->y); 
     318                        int distance = util::path_length(opponent->attacker->x, opponent->attacker->y, this->x, this->y); 
    315319 
    316320                        if ((distance < attacker_distance) || (distance == attacker_distance && opponent->damage > attacker_damage)) 
     
    760764                this->totaldamage = 0; 
    761765 
     766                short childid = -1; 
     767 
    762768                if (this->Data()->boss) 
    763769                { 
     
    766772                                if (npc->Data()->child && !npc->Data()->boss) 
    767773                                { 
    768                                         npc->Die(); 
     774                                        if (childid == -1 || childid == npc->Data()->id) 
     775                                        { 
     776                                                npc->Die(false); 
     777                                                childid = npc->Data()->id; 
     778                                        } 
     779                                        else 
     780                                        { 
     781                                                npc->Die(true); 
     782                                        } 
    769783                                } 
     784                        } 
     785                } 
     786 
     787                if (childid != -1) 
     788                { 
     789                        PacketBuilder builder(PACKET_NPC, PACKET_JUNK); 
     790                        builder.AddShort(childid); 
     791 
     792                        UTIL_PTR_LIST_FOREACH(this->map->characters, Character, character) 
     793                        { 
     794                                character->player->client->SendBuilder(builder); 
    770795                        } 
    771796                } 
     
    814839} 
    815840 
    816 void NPC::Die() 
     841void NPC::Die(bool show) 
    817842{ 
    818843        this->alive = false; 
    819844        this->dead_since = int(Timer::GetTime()); 
    820845 
    821         PacketBuilder builder(PACKET_NPC, PACKET_SPEC); 
    822         builder.AddShort(0); // killer pid 
    823         builder.AddChar(0); // killer direction 
    824         builder.AddShort(this->index); 
    825         builder.AddShort(0); // dropped item uid 
    826         builder.AddShort(0); // dropped item id 
    827         builder.AddChar(this->x); 
    828         builder.AddChar(this->y); 
    829         builder.AddInt(0); // dropped item amount 
    830         builder.AddThree(this->hp); // damage 
    831  
    832         UTIL_PTR_LIST_FOREACH(this->map->characters, Character, character) 
    833         { 
    834                 if (character->InRange(this)) 
    835                 { 
    836                         character->player->client->SendBuilder(builder); 
     846        UTIL_PTR_LIST_FOREACH(this->damagelist, NPC_Opponent, opponent) 
     847        { 
     848                erase_first(opponent->attacker->unregister_npc, this); 
     849        } 
     850 
     851        this->damagelist.clear(); 
     852        this->totaldamage = 0; 
     853 
     854        if (show) 
     855        { 
     856                PacketBuilder builder(PACKET_NPC, PACKET_SPEC); 
     857                builder.AddShort(0); // killer pid 
     858                builder.AddChar(0); // killer direction 
     859                builder.AddShort(this->index); 
     860                builder.AddShort(0); // dropped item uid 
     861                builder.AddShort(0); // dropped item id 
     862                builder.AddChar(this->x); 
     863                builder.AddChar(this->y); 
     864                builder.AddInt(0); // dropped item amount 
     865                builder.AddThree(this->hp); // damage 
     866 
     867                UTIL_PTR_LIST_FOREACH(this->map->characters, Character, character) 
     868                { 
     869                        if (character->InRange(this)) 
     870                        { 
     871                                character->player->client->SendBuilder(builder); 
     872                        } 
    837873                } 
    838874        } 
  • eoserv/trunk/src/npc.hpp

    r182 r184  
    133133                void Damage(Character *from, int amount); 
    134134                void RemoveFromView(Character *target); 
    135                 void Die(); 
     135                void Die(bool show = true); 
    136136 
    137137                void Attack(Character *target); 
     
    177177                SCRIPT_REGISTER_FUNCTION("void Damage(Character @, int)", Damage); 
    178178                SCRIPT_REGISTER_FUNCTION("void RemoveFromView(Character @)", RemoveFromView); 
    179                 SCRIPT_REGISTER_FUNCTION("void Die()", Die); 
     179                SCRIPT_REGISTER_FUNCTION("void Die(bool show)", Die); 
    180180                SCRIPT_REGISTER_FUNCTION("void Attack(Character @)", Attack); 
    181181        SCRIPT_REGISTER_END() 
  • eoserv/trunk/src/world.cpp

    r182 r184  
    3535                UTIL_PTR_VECTOR_FOREACH(map->npcs, NPC, npc) 
    3636                { 
    37                         if (!npc->alive && npc->dead_since + (double(npc->spawn_time) * spawnrate) < current_time && !npc->Data()->child) 
     37                        if ((!npc->alive && npc->dead_since + (double(npc->spawn_time) * spawnrate) < current_time) 
     38                         && (!npc->Data()->child || (npc->parent && npc->parent->alive && world->config["RespawnBossChildren"]))) 
    3839                        { 
    3940#ifdef DEBUG 
     
    372373} 
    373374 
     375void World::AdminReport(Character *from, std::string reportee, std::string message) 
     376{ 
     377        message = util::text_cap(message, static_cast<int>(this->config["ChatMaxWidth"]) - util::text_width(util::ucfirst(from->name) + "  reports: " + reportee + ", ")); 
     378 
     379        PacketBuilder builder(PACKET_ADMININTERACT, PACKET_REPLY); 
     380        builder.AddChar(2); // message type 
     381        builder.AddByte(255); 
     382        builder.AddBreakString(from->name); 
     383        builder.AddBreakString(message); 
     384        builder.AddBreakString(reportee); 
     385 
     386        UTIL_PTR_VECTOR_FOREACH(this->characters, Character, character) 
     387        { 
     388                if (character->admin >= static_cast<int>(this->admin_config["reports"])) 
     389                { 
     390                        character->player->client->SendBuilder(builder); 
     391                } 
     392        } 
     393 
     394        short boardid = static_cast<int>(this->server->world->config["AdminBoard"]) - 1; 
     395 
     396        if (static_cast<std::size_t>(boardid) < this->server->world->boards.size()) 
     397        { 
     398                Board *admin_board = this->server->world->boards[boardid]; 
     399 
     400                Board_Post *newpost = new Board_Post; 
     401                newpost->id = ++admin_board->last_id; 
     402                newpost->author = from->name; 
     403                newpost->author_admin = from->admin; 
     404                newpost->subject = std::string(" [Report] ") + util::ucfirst(from->name) + " reports: " + reportee; 
     405                newpost->body = message; 
     406                newpost->time = Timer::GetTime(); 
     407 
     408                admin_board->posts.push_front(newpost); 
     409 
     410                if (admin_board->posts.size() > static_cast<std::size_t>(static_cast<int>(this->server->world->config["AdminBoardLimit"]))) 
     411                { 
     412                        admin_board->posts.pop_back(); 
     413                } 
     414        } 
     415} 
     416 
     417void World::AdminRequest(Character *from, std::string message) 
     418{ 
     419        message = util::text_cap(message, static_cast<int>(this->config["ChatMaxWidth"]) - util::text_width(util::ucfirst(from->name) + "  needs help: ")); 
     420 
     421        PacketBuilder builder(PACKET_ADMININTERACT, PACKET_REPLY); 
     422        builder.AddChar(1); // message type 
     423        builder.AddByte(255); 
     424        builder.AddBreakString(from->name); 
     425        builder.AddBreakString(message); 
     426 
     427        UTIL_PTR_VECTOR_FOREACH(this->characters, Character, character) 
     428        { 
     429                if (character->admin >= static_cast<int>(this->admin_config["reports"])) 
     430                { 
     431                        character->player->client->SendBuilder(builder); 
     432                } 
     433        } 
     434 
     435        short boardid = static_cast<int>(this->server->world->config["AdminBoard"]) - 1; 
     436 
     437        if (static_cast<std::size_t>(boardid) < this->server->world->boards.size()) 
     438        { 
     439                Board *admin_board = this->server->world->boards[boardid]; 
     440 
     441                Board_Post *newpost = new Board_Post; 
     442                newpost->id = ++admin_board->last_id; 
     443                newpost->author = from->name; 
     444                newpost->author_admin = from->admin; 
     445                newpost->subject = std::string(" [Request] ") + util::ucfirst(from->name) + " needs help"; 
     446                newpost->body = message; 
     447                newpost->time = Timer::GetTime(); 
     448 
     449                admin_board->posts.push_front(newpost); 
     450 
     451                if (admin_board->posts.size() > static_cast<std::size_t>(static_cast<int>(this->server->world->config["AdminBoardLimit"]))) 
     452                { 
     453                        admin_board->posts.pop_back(); 
     454                } 
     455        } 
     456} 
     457 
    374458void World::Rehash() 
    375459{ 
  • eoserv/trunk/src/world.hpp

    r182 r184  
    104104                void AnnounceMsg(Character *from, std::string message, bool echo = true); 
    105105                void ServerMsg(std::string message); 
     106                void AdminReport(Character *from, std::string reportee, std::string message); 
     107                void AdminRequest(Character *from, std::string message); 
    106108 
    107109                void Reboot(); 
     
    164166                SCRIPT_REGISTER_FUNCTION("void AnnounceMsg(Character @, string, bool echo)", AnnounceMsg); 
    165167                SCRIPT_REGISTER_FUNCTION("void ServerMsg(string)", ServerMsg); 
     168                SCRIPT_REGISTER_FUNCTION("void AdminReport(Character @, string reportee, string message)", AdminReport); 
     169                SCRIPT_REGISTER_FUNCTION("void AdminRequest(Character @, string message)", AdminRequest); 
    166170                //SCRIPT_REGISTER_FUNCTION_PR("void Reboot()", Reboot, (), void); 
    167171                //SCRIPT_REGISTER_FUNCTION_PR("void Reboot(int, string)", Reboot, (int, std::string), void);