Changeset 260 for trunk/src/game

Show
Ignore:
Timestamp:
11/21/08 08:47:55 (17 years ago)
Author:
yumileroy
Message:

*DB script table stucture change. Source Mangos. Also fix some bugs. Hopefully this rev will make program usable again.

Original author: megamage
Date: 2008-11-20 10:43:20-06:00

Location:
trunk/src/game
Files:
36 modified

Legend:

Unmodified
Added
Removed
  • trunk/src/game/AuctionHouse.cpp

    r229 r260  
    1111 * This program is distributed in the hope that it will be useful, 
    1212 * but WITHOUT ANY WARRANTY; without even the implied warranty of 
    13  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 
     13 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the 
    1414 * GNU General Public License for more details. 
    1515 * 
    1616 * You should have received a copy of the GNU General Public License 
    1717 * along with this program; if not, write to the Free Software 
    18  * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA 
     18 * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307 USA 
    1919 */ 
    2020 
     
    9090        return false; 
    9191    } 
    92     data << auction->Id; 
    93     data << pItem->GetUInt32Value(OBJECT_FIELD_ENTRY); 
     92    data << (uint32) auction->Id; 
     93    data << (uint32) pItem->GetEntry(); 
    9494 
    9595    for (uint8 i = 0; i < MAX_INSPECTED_ENCHANTMENT_SLOT; i++) 
     
    246246        return; 
    247247    } 
    248     // prevent sending bag with items (cheat: can be placed in bag after adding equipped empty bag to auction) 
     248    // prevent sending bag with items (cheat: can be placed in bag after adding equiped empty bag to auction) 
    249249    if(!it) 
    250250    { 
     
    717717                                            if (il) 
    718718                                            { 
    719                                                 if (il->Name.size() > loc_idx && !il->Name[loc_idx].empty()) 
     719                                                if (il->Name.size() > size_t(loc_idx) && !il->Name[loc_idx].empty()) 
    720720                                                    name = il->Name[loc_idx]; 
    721721                                            } 
  • trunk/src/game/Bag.cpp

    r177 r260  
    1111 * This program is distributed in the hope that it will be useful, 
    1212 * but WITHOUT ANY WARRANTY; without even the implied warranty of 
    13  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 
     13 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the 
    1414 * GNU General Public License for more details. 
    1515 * 
    1616 * You should have received a copy of the GNU General Public License 
    1717 * along with this program; if not, write to the Free Software 
    18  * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA 
     18 * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307 USA 
    1919 */ 
    2020 
     
    4242    for(int i = 0; i < MAX_BAG_SIZE; ++i) 
    4343        if (m_bagslot[i]) 
    44              delete m_bagslot[i]; 
     44            delete m_bagslot[i]; 
    4545} 
    4646 
     
    7272    Object::_Create( guidlow, 0, HIGHGUID_CONTAINER ); 
    7373 
    74     SetUInt32Value(OBJECT_FIELD_ENTRY, itemid); 
     74    SetEntry(itemid); 
    7575    SetFloatValue(OBJECT_FIELD_SCALE_X, 1.0f); 
    7676 
     
    8686    SetUInt32Value(CONTAINER_FIELD_NUM_SLOTS, itemProto->ContainerSlots); 
    8787 
    88     // Cleanning 20 slots 
     88    // Cleaning 20 slots 
    8989    for (uint8 i = 0; i < MAX_BAG_SIZE; i++) 
    9090    { 
     
    214214            if(m_bagslot[i]->GetGUID() == guid) 
    215215                return i; 
     216 
    216217    return NULL_SLOT; 
    217218} 
     
    221222    if( slot < GetBagSize() ) 
    222223        return m_bagslot[slot]; 
    223          
     224 
    224225    return NULL; 
    225226} 
  • trunk/src/game/Chat.cpp

    r233 r260  
    6464    }; 
    6565 
     66    static ChatCommand serverIdleRestartCommandTable[] = 
     67    { 
     68        { "cancel",         SEC_ADMINISTRATOR,  true,  &ChatHandler::HandleServerShutDownCancelCommand,"", NULL }, 
     69        { ""   ,            SEC_ADMINISTRATOR,  true,  &ChatHandler::HandleServerIdleRestartCommand,   "", NULL }, 
     70        { NULL,             0,                  false, NULL,                                           "", NULL } 
     71    }; 
     72 
     73    static ChatCommand serverIdleShutdownCommandTable[] = 
     74    { 
     75        { "cancel",         SEC_ADMINISTRATOR,  true,  &ChatHandler::HandleServerShutDownCancelCommand,"", NULL }, 
     76        { ""   ,            SEC_ADMINISTRATOR,  true,  &ChatHandler::HandleServerIdleShutDownCommand,  "", NULL }, 
     77        { NULL,             0,                  false, NULL,                                           "", NULL } 
     78    }; 
     79 
     80    static ChatCommand serverRestartCommandTable[] = 
     81    { 
     82        { "cancel",         SEC_ADMINISTRATOR,  true,  &ChatHandler::HandleServerShutDownCancelCommand,"", NULL }, 
     83        { ""   ,            SEC_ADMINISTRATOR,  true,  &ChatHandler::HandleServerRestartCommand,       "", NULL }, 
     84        { NULL,             0,                  false, NULL,                                           "", NULL } 
     85    }; 
     86 
     87    static ChatCommand serverShutdownCommandTable[] = 
     88    { 
     89        { "cancel",         SEC_ADMINISTRATOR,  true,  &ChatHandler::HandleServerShutDownCancelCommand,"", NULL }, 
     90        { ""   ,            SEC_ADMINISTRATOR,  true,  &ChatHandler::HandleServerShutDownCommand,      "", NULL }, 
     91        { NULL,             0,                  false, NULL,                                           "", NULL } 
     92    }; 
     93 
    6694    static ChatCommand serverCommandTable[] = 
    6795    { 
    6896        { "corpses",        SEC_GAMEMASTER,     true,  &ChatHandler::HandleServerCorpsesCommand,       "", NULL }, 
    6997        { "exit",           SEC_CONSOLE,        true,  &ChatHandler::HandleServerExitCommand,          "", NULL }, 
    70         { "idlerestart",    SEC_ADMINISTRATOR,  true,  &ChatHandler::HandleIdleRestartCommand,         "", NULL }, 
    71         { "idleshutdown",   SEC_ADMINISTRATOR,  true,  &ChatHandler::HandleIdleShutDownCommand,        "", NULL }, 
     98        { "idlerestart",    SEC_ADMINISTRATOR,  true,  NULL,                                           "", serverIdleRestartCommandTable }, 
     99        { "idleshutdown",   SEC_ADMINISTRATOR,  true,  NULL,                                           "", serverShutdownCommandTable }, 
    72100        { "info",           SEC_PLAYER,         true,  &ChatHandler::HandleServerInfoCommand,          "", NULL }, 
    73101        { "motd",           SEC_PLAYER,         true,  &ChatHandler::HandleServerMotdCommand,          "", NULL }, 
    74         { "restart",        SEC_ADMINISTRATOR,  true,  &ChatHandler::HandleRestartCommand,             "", NULL }, 
    75         { "shutdown",       SEC_ADMINISTRATOR,  true,  &ChatHandler::HandleShutDownCommand,            "", NULL }, 
     102        { "restart",        SEC_ADMINISTRATOR,  true,  NULL,                                           "", serverRestartCommandTable }, 
     103        { "shutdown",       SEC_ADMINISTRATOR,  true,  NULL,                                           "", serverShutdownCommandTable }, 
    76104        { "set",            SEC_ADMINISTRATOR,  true,  NULL,                                           "", serverSetCommandTable }, 
    77105        { NULL,             0,                  false, NULL,                                           "", NULL } 
  • trunk/src/game/Chat.h

    r233 r260  
    176176        bool HandleModifyRepCommand(const char* args); 
    177177        bool HandleModifyArenaCommand(const char* args); 
     178        bool HandleModifyGenderCommand(const char* args); 
    178179 
    179180        bool HandleNpcAddCommand(const char* args); 
     
    192193        bool HandleNpcSpawnDistCommand(const char* args); 
    193194        bool HandleNpcSpawnTimeCommand(const char* args); 
     195        bool HandleNpcTameCommand(const char* args); 
    194196        bool HandleNpcTextEmoteCommand(const char* args); 
    195197        bool HandleNpcUnFollowCommand(const char* args); 
     
    216218        bool HandleReloadCreatureQuestRelationsCommand(const char* args); 
    217219        bool HandleReloadCreatureQuestInvRelationsCommand(const char* args); 
     220        bool HandleReloadDbScriptStringCommand(const char* args); 
    218221        bool HandleReloadGameGraveyardZoneCommand(const char* args); 
    219222        bool HandleReloadGameObjectScriptsCommand(const char* args); 
     
    271274        bool HandleServerCorpsesCommand(const char* args); 
    272275        bool HandleServerExitCommand(const char* args); 
     276        bool HandleServerIdleRestartCommand(const char* args); 
     277        bool HandleServerIdleShutDownCommand(const char* args); 
    273278        bool HandleServerInfoCommand(const char* args); 
    274279        bool HandleServerMotdCommand(const char* args); 
     280        bool HandleServerRestartCommand(const char* args); 
    275281        bool HandleServerSetMotdCommand(const char* args); 
    276282        bool HandleServerSetLogLevelCommand(const char* args); 
     283        bool HandleServerShutDownCommand(const char* args); 
     284        bool HandleServerShutDownCancelCommand(const char* args); 
    277285 
    278286        bool HandleAddHonorCommand(const char* args); 
     
    328336        bool HandleBanListCharacterCommand(const char* args); 
    329337        bool HandleBanListIPCommand(const char* args); 
    330         bool HandleIdleRestartCommand(const char* args); 
    331         bool HandleIdleShutDownCommand(const char* args); 
    332         bool HandleShutDownCommand(const char* args); 
    333         bool HandleRestartCommand(const char* args); 
    334         bool HandleSecurityCommand(const char* args); 
    335338        bool HandleGoXYCommand(const char* args); 
    336339        bool HandleGoXYZCommand(const char* args); 
     
    366369        bool HandleAddItemCommand(const char* args); 
    367370        bool HandleAddItemSetCommand(const char* args); 
    368         bool HandleModifyGenderCommand(const char* args); 
    369371        bool HandlePetTpCommand(const char* args); 
    370372        bool HandlePetUnlearnCommand(const char* args); 
  • trunk/src/game/Creature.cpp

    r230 r260  
    178178    float x,y,z,o; 
    179179    GetRespawnCoord(x, y, z, &o); 
    180     MapManager::Instance().GetMap(GetMapId(), this)->CreatureRelocation(this,x,y,z,o); 
     180    GetMap()->CreatureRelocation(this,x,y,z,o); 
    181181} 
    182182 
     
    210210    } 
    211211 
    212     SetUInt32Value(OBJECT_FIELD_ENTRY, Entry);              // normal entry always 
     212    SetEntry(Entry);                                        // normal entry always 
    213213    m_creatureInfo = cinfo;                                 // map mode related always 
    214214 
     
    353353                lootForBody         = false; 
    354354 
    355                 if(m_originalEntry != GetUInt32Value(OBJECT_FIELD_ENTRY)) 
     355                if(m_originalEntry != GetEntry()) 
    356356                    UpdateEntry(m_originalEntry); 
    357357 
     
    372372 
    373373                //Call AI respawn virtual function 
    374                 AI()->JustRespawned(); 
    375  
    376                 MapManager::Instance().GetMap(GetMapId(), this)->Add(this); 
     374                i_AI->JustRespawned(); 
     375 
     376                GetMap()->Add(this); 
    377377            } 
    378378            break; 
     
    436436                // do not allow the AI to be changed during update 
    437437                m_AI_locked = true; 
    438                 AI()->UpdateAI(diff); 
     438                i_AI->UpdateAI(diff); 
    439439                m_AI_locked = false; 
    440440            } 
     
    20972097} 
    20982098 
    2099 char const* Creature::GetScriptName() const 
    2100 { 
    2101     return ObjectMgr::GetCreatureTemplate(GetEntry())->ScriptName; 
     2099std::string Creature::GetScriptName() 
     2100{ 
     2101    return objmgr.GetScriptName(GetScriptId()); 
     2102} 
     2103 
     2104uint32 Creature::GetScriptId() 
     2105{ 
     2106    return ObjectMgr::GetCreatureTemplate(GetEntry())->ScriptID; 
    21022107} 
    21032108 
  • trunk/src/game/Creature.h

    r230 r260  
    1111 * This program is distributed in the hope that it will be useful, 
    1212 * but WITHOUT ANY WARRANTY; without even the implied warranty of 
    13  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 
     13 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the 
    1414 * GNU General Public License for more details. 
    1515 * 
    1616 * You should have received a copy of the GNU General Public License 
    1717 * along with this program; if not, write to the Free Software 
    18  * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA 
     18 * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307 USA 
    1919 */ 
    2020 
     
    206206    uint32  MechanicImmuneMask; 
    207207    uint32  flags_extra; 
    208     char const* ScriptName; 
     208    uint32  ScriptID; 
    209209    uint32 GetRandomValidModelId() const; 
    210210    uint32 GetFirstValidModelId() const; 
    211      
     211 
     212    // helpers 
    212213    SkillType GetRequiredLootSkill() const 
    213214    { 
     
    219220            return SKILL_SKINNING;                          // normal case 
    220221    } 
    221      
     222 
    222223    bool isTameable() const 
    223224    { 
     
    499500        CreatureInfo const *GetCreatureInfo() const { return m_creatureInfo; } 
    500501        CreatureDataAddon const* GetCreatureAddon() const; 
    501         char const* GetScriptName() const; 
     502 
     503        std::string GetScriptName(); 
     504        uint32 GetScriptId(); 
    502505 
    503506        void prepareGossipMenu( Player *pPlayer, uint32 gossipid = 0 ); 
     
    525528        // overwrite WorldObject function for proper name localization 
    526529        const char* GetNameForLocaleIdx(int32 locale_idx) const; 
    527      
     530 
    528531        void setDeathState(DeathState s);                   // overwrite virtual Unit::setDeathState 
    529532 
  • trunk/src/game/CreatureAI.cpp

    r207 r260  
    1111 * This program is distributed in the hope that it will be useful, 
    1212 * but WITHOUT ANY WARRANTY; without even the implied warranty of 
    13  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 
     13 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the 
    1414 * GNU General Public License for more details. 
    1515 * 
    1616 * You should have received a copy of the GNU General Public License 
    1717 * along with this program; if not, write to the Free Software 
    18  * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA 
     18 * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307 USA 
    1919 */ 
    2020 
  • trunk/src/game/CreatureAIImpl.h

    r102 r260  
    1111 * This program is distributed in the hope that it will be useful, 
    1212 * but WITHOUT ANY WARRANTY; without even the implied warranty of 
    13  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 
     13 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the 
    1414 * GNU General Public License for more details. 
    1515 * 
    1616 * You should have received a copy of the GNU General Public License 
    1717 * along with this program; if not, write to the Free Software 
    18  * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA 
     18 * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307 USA 
    1919 */ 
    2020#ifndef CREATUREAIIMPL_H 
  • trunk/src/game/CreatureAIRegistry.cpp

    r174 r260  
    1111 * This program is distributed in the hope that it will be useful, 
    1212 * but WITHOUT ANY WARRANTY; without even the implied warranty of 
    13  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 
     13 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the 
    1414 * GNU General Public License for more details. 
    1515 * 
    1616 * You should have received a copy of the GNU General Public License 
    1717 * along with this program; if not, write to the Free Software 
    18  * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA 
     18 * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307 USA 
    1919 */ 
    2020 
  • trunk/src/game/CreatureAISelector.cpp

    r174 r260  
    1111 * This program is distributed in the hope that it will be useful, 
    1212 * but WITHOUT ANY WARRANTY; without even the implied warranty of 
    13  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 
     13 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the 
    1414 * GNU General Public License for more details. 
    1515 * 
    1616 * You should have received a copy of the GNU General Public License 
    1717 * along with this program; if not, write to the Free Software 
    18  * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA 
     18 * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307 USA 
    1919 */ 
    2020 
  • trunk/src/game/Formulas.h

    r111 r260  
    1111 * This program is distributed in the hope that it will be useful, 
    1212 * but WITHOUT ANY WARRANTY; without even the implied warranty of 
    13  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 
     13 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the 
    1414 * GNU General Public License for more details. 
    1515 * 
    1616 * You should have received a copy of the GNU General Public License 
    1717 * along with this program; if not, write to the Free Software 
    18  * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA 
     18 * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307 USA 
    1919 */ 
    2020 
     
    3030        inline uint32 hk_honor_at_level(uint32 level, uint32 count=1) 
    3131        { 
    32             return (uint32) ceil(count*(-0.53177f + 0.59357f * exp((level +23.54042f) / 26.07859f ))); 
     32            return (uint32)ceil(count*(-0.53177f + 0.59357f * exp((level +23.54042f) / 26.07859f ))); 
    3333        } 
    3434    } 
     
    8181        inline uint32 BaseGain(uint32 pl_level, uint32 mob_level, ContentLevels content) 
    8282        { 
     83            //TODO: need modifier for CONTENT_71_80 different from CONTENT_61_70? 
    8384            const uint32 nBaseExp = content == CONTENT_1_60 ? 45 : 235; 
    8485            if( mob_level >= pl_level ) 
  • trunk/src/game/GMTicketHandler.cpp

    r229 r260  
    1111 * This program is distributed in the hope that it will be useful, 
    1212 * but WITHOUT ANY WARRANTY; without even the implied warranty of 
    13  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 
     13 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the 
    1414 * GNU General Public License for more details. 
    1515 * 
    1616 * You should have received a copy of the GNU General Public License 
    1717 * along with this program; if not, write to the Free Software 
    18  * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA 
     18 * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307 USA 
    1919 */ 
    2020 
     
    6767    recv_data >> ticketText; 
    6868 
    69     CharacterDatabase.escape_string(ticketText); 
    70  
    7169    if(GMTicket* ticket = ticketmgr.GetGMTicket(GetPlayer()->GetGUIDLow())) 
    7270        ticket->SetText(ticketText.c_str()); 
     
    106104    sLog.outDebug("TicketCreate: map %u, x %f, y %f, z %f, text %s, unk1 %u, unk2 %u", map, x, y, z, ticketText.c_str(), unk1, unk2); 
    107105 
    108     CharacterDatabase.escape_string(ticketText); 
    109  
    110     if(GMTicket* ticket = ticketmgr.GetGMTicket(GetPlayer()->GetGUIDLow())) 
     106    if(ticketmgr.GetGMTicket(GetPlayer()->GetGUIDLow())) 
    111107    { 
    112108        WorldPacket data( SMSG_GMTICKET_CREATE, 4 ); 
  • trunk/src/game/GMTicketMgr.h

    r229 r260  
    5151            m_text = text ? text : ""; 
    5252            m_lastUpdate = time(NULL); 
    53             CharacterDatabase.PExecute("UPDATE character_ticket SET ticket_text = '%s' WHERE guid = '%u'", m_text.c_str(), m_guid); 
     53 
     54            std::string escapedString = m_text; 
     55            CharacterDatabase.escape_string(escapedString); 
     56            CharacterDatabase.PExecute("UPDATE character_ticket SET ticket_text = '%s' WHERE guid = '%u'", escapedString.c_str(), m_guid); 
    5457        } 
    5558 
     
    6366            CharacterDatabase.BeginTransaction(); 
    6467            DeleteFromDB(); 
    65             CharacterDatabase.PExecute("INSERT INTO character_ticket (guid, ticket_text) VALUES ('%u', '%s')", m_guid, GetText()); 
     68 
     69            std::string escapedString = m_text; 
     70            CharacterDatabase.escape_string(escapedString); 
     71 
     72            CharacterDatabase.PExecute("INSERT INTO character_ticket (guid, ticket_text) VALUES ('%u', '%s')", m_guid, escapedString.c_str()); 
    6673            CharacterDatabase.CommitTransaction(); 
    6774        } 
  • trunk/src/game/GameObject.h

    r230 r260  
    1111 * This program is distributed in the hope that it will be useful, 
    1212 * but WITHOUT ANY WARRANTY; without even the implied warranty of 
    13  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 
     13 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the 
    1414 * GNU General Public License for more details. 
    1515 * 
    1616 * You should have received a copy of the GNU General Public License 
    1717 * along with this program; if not, write to the Free Software 
    18  * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA 
     18 * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307 USA 
    1919 */ 
    2020 
     
    358358        } raw; 
    359359    }; 
    360     char   *ScriptName; 
     360    uint32 ScriptId; 
    361361}; 
    362362 
  • trunk/src/game/Item.cpp

    r102 r260  
    1111 * This program is distributed in the hope that it will be useful, 
    1212 * but WITHOUT ANY WARRANTY; without even the implied warranty of 
    13  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 
     13 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the 
    1414 * GNU General Public License for more details. 
    1515 * 
    1616 * You should have received a copy of the GNU General Public License 
    1717 * along with this program; if not, write to the Free Software 
    18  * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA 
     18 * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307 USA 
    1919 */ 
    2020 
     
    180180                    return true; 
    181181                case ITEM_SUBCLASS_SOUL_CONTAINER: 
    182                     if(!(pProto->BagFamily & BAG_FAMILY_MASK_SHARDS)) 
     182                    if(!(pProto->BagFamily & BAG_FAMILY_MASK_SOUL_SHARDS)) 
    183183                        return false; 
    184184                    return true; 
     
    248248    Object::_Create( guidlow, 0, HIGHGUID_ITEM ); 
    249249 
    250     SetUInt32Value(OBJECT_FIELD_ENTRY, itemid); 
     250    SetEntry(itemid); 
    251251    SetFloatValue(OBJECT_FIELD_SCALE_X, 1.0f); 
    252252 
     
    430430ItemPrototype const *Item::GetProto() const 
    431431{ 
    432     return objmgr.GetItemPrototype(GetUInt32Value(OBJECT_FIELD_ENTRY)); 
     432    return objmgr.GetItemPrototype(GetEntry()); 
    433433} 
    434434 
     
    763763{ 
    764764    // Better lost small time at check in comparison lost time at item save to DB. 
    765     if( GetUInt32Value(ITEM_FIELD_ENCHANTMENT + slot*MAX_ENCHANTMENT_OFFSET + ENCHANTMENT_ID_OFFSET)==id && 
    766         GetUInt32Value(ITEM_FIELD_ENCHANTMENT + slot*MAX_ENCHANTMENT_OFFSET + ENCHANTMENT_DURATION_OFFSET)==duration && 
    767         GetUInt32Value(ITEM_FIELD_ENCHANTMENT + slot*MAX_ENCHANTMENT_OFFSET + ENCHANTMENT_CHARGES_OFFSET)==charges ) 
     765    if((GetEnchantmentId(slot) == id) && (GetEnchantmentDuration(slot) == duration) && (GetEnchantmentCharges(slot) == charges)) 
    768766        return; 
    769767 
     
    776774void Item::SetEnchantmentDuration(EnchantmentSlot slot, uint32 duration) 
    777775{ 
    778     if(GetUInt32Value(ITEM_FIELD_ENCHANTMENT + slot*MAX_ENCHANTMENT_OFFSET + ENCHANTMENT_DURATION_OFFSET)==duration) 
     776    if(GetEnchantmentDuration(slot) == duration) 
    779777        return; 
    780778 
     
    785783void Item::SetEnchantmentCharges(EnchantmentSlot slot, uint32 charges) 
    786784{ 
     785    if(GetEnchantmentCharges(slot) == charges) 
     786        return; 
     787 
    787788    SetUInt32Value(ITEM_FIELD_ENCHANTMENT + slot*MAX_ENCHANTMENT_OFFSET + ENCHANTMENT_CHARGES_OFFSET,charges); 
    788789    SetState(ITEM_CHANGED); 
     
    791792void Item::ClearEnchantment(EnchantmentSlot slot) 
    792793{ 
    793     if(!GetUInt32Value(ITEM_FIELD_ENCHANTMENT + slot*MAX_ENCHANTMENT_OFFSET + ENCHANTMENT_ID_OFFSET)) 
    794         return; 
    795  
    796     for(int x=0;x<3;x++) 
    797         SetUInt32Value(ITEM_FIELD_ENCHANTMENT + slot*MAX_ENCHANTMENT_OFFSET + x,0); 
     794    if(!GetEnchantmentId(slot)) 
     795        return; 
     796 
     797    for(uint8 x = 0; x < 3; ++x) 
     798        SetUInt32Value(ITEM_FIELD_ENCHANTMENT + slot*MAX_ENCHANTMENT_OFFSET + x, 0); 
    798799    SetState(ITEM_CHANGED); 
    799800} 
  • trunk/src/game/Item.h

    r102 r260  
    1111 * This program is distributed in the hope that it will be useful, 
    1212 * but WITHOUT ANY WARRANTY; without even the implied warranty of 
    13  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 
     13 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the 
    1414 * GNU General Public License for more details. 
    1515 * 
    1616 * You should have received a copy of the GNU General Public License 
    1717 * along with this program; if not, write to the Free Software 
    18  * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA 
     18 * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307 USA 
    1919 */ 
    2020 
     
    229229        bool GemsFitSockets() const; 
    230230 
    231         uint32 GetEntry() const { return GetUInt32Value(OBJECT_FIELD_ENTRY); } 
    232231        uint32 GetCount() const { return GetUInt32Value (ITEM_FIELD_STACK_COUNT); } 
    233232        void SetCount(uint32 value) { SetUInt32Value (ITEM_FIELD_STACK_COUNT, value); } 
  • trunk/src/game/ItemEnchantmentMgr.cpp

    r206 r260  
    1111 * This program is distributed in the hope that it will be useful, 
    1212 * but WITHOUT ANY WARRANTY; without even the implied warranty of 
    13  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 
     13 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the 
    1414 * GNU General Public License for more details. 
    1515 * 
    1616 * You should have received a copy of the GNU General Public License 
    1717 * along with this program; if not, write to the Free Software 
    18  * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA 
     18 * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307 USA 
    1919 */ 
    2020 
  • trunk/src/game/ItemEnchantmentMgr.h

    r102 r260  
    1111 * This program is distributed in the hope that it will be useful, 
    1212 * but WITHOUT ANY WARRANTY; without even the implied warranty of 
    13  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 
     13 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the 
    1414 * GNU General Public License for more details. 
    1515 * 
    1616 * You should have received a copy of the GNU General Public License 
    1717 * along with this program; if not, write to the Free Software 
    18  * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA 
     18 * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307 USA 
    1919 */ 
    2020 
  • trunk/src/game/ItemHandler.cpp

    r229 r260  
    1111 * This program is distributed in the hope that it will be useful, 
    1212 * but WITHOUT ANY WARRANTY; without even the implied warranty of 
    13  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 
     13 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the 
    1414 * GNU General Public License for more details. 
    1515 * 
    1616 * You should have received a copy of the GNU General Public License 
    1717 * along with this program; if not, write to the Free Software 
    18  * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA 
     18 * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307 USA 
    1919 */ 
    2020 
     
    314314            if (il) 
    315315            { 
    316                 if (il->Name.size() > loc_idx && !il->Name[loc_idx].empty()) 
     316                if (il->Name.size() > size_t(loc_idx) && !il->Name[loc_idx].empty()) 
    317317                    Name = il->Name[loc_idx]; 
    318                 if (il->Description.size() > loc_idx && !il->Description[loc_idx].empty()) 
     318                if (il->Description.size() > size_t(loc_idx) && !il->Description[loc_idx].empty()) 
    319319                    Description = il->Description[loc_idx]; 
    320320            } 
     
    361361            data << pProto->Damage[i].DamageType; 
    362362        } 
     363 
     364        // resistances (7) 
    363365        data << pProto->Armor; 
    364366        data << pProto->HolyRes; 
     
    368370        data << pProto->ShadowRes; 
    369371        data << pProto->ArcaneRes; 
     372 
    370373        data << pProto->Delay; 
    371374        data << pProto->Ammo_type; 
    372  
    373         data << (float)pProto->RangedModRange; 
     375        data << pProto->RangedModRange; 
     376 
    374377        for(int s = 0; s < 5; s++) 
    375378        { 
     
    977980            if (il) 
    978981            { 
    979                 if (il->Name.size() > loc_idx && !il->Name[loc_idx].empty()) 
     982                if (il->Name.size() > size_t(loc_idx) && !il->Name[loc_idx].empty()) 
    980983                    Name = il->Name[loc_idx]; 
    981984            } 
     
    10281031    } 
    10291032 
    1030     if(item==gift)                                          // not possible with pacjket from real client 
     1033    if(item==gift)                                          // not possable with pacjket from real client 
    10311034    { 
    10321035        _player->SendEquipError( EQUIP_ERR_WRAPPED_CANT_BE_WRAPPED, item, NULL ); 
     
    10731076    CharacterDatabase.BeginTransaction(); 
    10741077    CharacterDatabase.PExecute("INSERT INTO character_gifts VALUES ('%u', '%u', '%u', '%u')", GUID_LOPART(item->GetOwnerGUID()), item->GetGUIDLow(), item->GetEntry(), item->GetUInt32Value(ITEM_FIELD_FLAGS)); 
    1075     item->SetUInt32Value(OBJECT_FIELD_ENTRY, gift->GetUInt32Value(OBJECT_FIELD_ENTRY)); 
     1078    item->SetEntry(gift->GetEntry()); 
    10761079 
    10771080    switch (item->GetEntry()) 
    10781081    { 
    1079         case 5042:  item->SetUInt32Value(OBJECT_FIELD_ENTRY, 5043); break; 
    1080         case 5048:  item->SetUInt32Value(OBJECT_FIELD_ENTRY, 5044); break; 
    1081         case 17303: item->SetUInt32Value(OBJECT_FIELD_ENTRY, 17302); break; 
    1082         case 17304: item->SetUInt32Value(OBJECT_FIELD_ENTRY, 17305); break; 
    1083         case 17307: item->SetUInt32Value(OBJECT_FIELD_ENTRY, 17308); break; 
    1084         case 21830: item->SetUInt32Value(OBJECT_FIELD_ENTRY, 21831); break; 
     1082        case 5042:  item->SetEntry( 5043); break; 
     1083        case 5048:  item->SetEntry( 5044); break; 
     1084        case 17303: item->SetEntry(17302); break; 
     1085        case 17304: item->SetEntry(17305); break; 
     1086        case 17307: item->SetEntry(17308); break; 
     1087        case 21830: item->SetEntry(21831); break; 
    10851088    } 
    10861089    item->SetUInt64Value(ITEM_FIELD_GIFTCREATOR, _player->GetGUID()); 
  • trunk/src/game/ItemPrototype.h

    r257 r260  
    1111 * This program is distributed in the hope that it will be useful, 
    1212 * but WITHOUT ANY WARRANTY; without even the implied warranty of 
    13  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 
     13 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the 
    1414 * GNU General Public License for more details. 
    1515 * 
    1616 * You should have received a copy of the GNU General Public License 
    1717 * along with this program; if not, write to the Free Software 
    18  * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA 
     18 * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307 USA 
    1919 */ 
    2020 
     
    100100    ITEM_FLAGS_USEABLE_IN_ARENA               = 0x00200000, 
    101101    ITEM_FLAGS_THROWABLE                      = 0x00400000, // not used in game for check trow possibility, only for item in game tooltip 
    102     ITEM_FLAGS_SPECIALUSE                     = 0x00800000  // last used flag in 2.3.0 
     102    ITEM_FLAGS_SPECIALUSE                     = 0x00800000, // last used flag in 2.3.0 
     103    ITEM_FLAGS_BOA                            = 0x08000000, // bind on account 
     104    ITEM_FLAGS_MILLABLE                       = 0x20000000 
    103105}; 
    104106 
     
    107109    BAG_FAMILY_MASK_ARROWS                    = 0x00000001, 
    108110    BAG_FAMILY_MASK_BULLETS                   = 0x00000002, 
    109     BAG_FAMILY_MASK_SHARDS                    = 0x00000004, 
     111    BAG_FAMILY_MASK_SOUL_SHARDS               = 0x00000004, 
    110112    BAG_FAMILY_MASK_LEATHERWORKING_SUPP       = 0x00000008, 
    111     BAG_FAMILY_MASK_UNUSED                    = 0x00000010, // not used currently 
     113    BAG_FAMILY_MASK_INSCRIPTION_SUPP          = 0x00000010, 
    112114    BAG_FAMILY_MASK_HERBS                     = 0x00000020, 
    113115    BAG_FAMILY_MASK_ENCHANTING_SUPP           = 0x00000040, 
     
    117119    BAG_FAMILY_MASK_MINING_SUPP               = 0x00000400, 
    118120    BAG_FAMILY_MASK_SOULBOUND_EQUIPMENT       = 0x00000800, 
    119     BAG_FAMILY_MASK_VANITY_PETS               = 0x00001000 
    120 }; 
    121  
    122 /* TODO: Not entirely positive on need for this?? 
    123 enum SOCKET_CONTENT (); 
    124 */ 
     121    BAG_FAMILY_MASK_VANITY_PETS               = 0x00001000, 
     122    BAG_FAMILY_MASK_CURRENCY_TOKENS           = 0x00002000, 
     123    BAG_FAMILY_MASK_QUEST_ITEMS               = 0x00004000 
     124}; 
    125125 
    126126enum SocketColor 
     
    276276}; 
    277277 
    278 #define MAX_ITEM_SUBCLASS_ARMOR                  10 
     278#define MAX_ITEM_SUBCLASS_ARMOR                   10 
    279279 
    280280enum ItemSubclassReagent 
     
    390390 
    391391#define MAX_ITEM_SUBCLASS_JUNK                    6 
     392 
     393enum ItemSubclassGlyph 
     394{ 
     395    ITEM_SUBCLASS_GLYPH_WARRIOR                 = 1, 
     396    ITEM_SUBCLASS_GLYPH_PALADIN                 = 2, 
     397    ITEM_SUBCLASS_GLYPH_HUNTER                  = 3, 
     398    ITEM_SUBCLASS_GLYPH_ROGUE                   = 4, 
     399    ITEM_SUBCLASS_GLYPH_PRIEST                  = 5, 
     400    ITEM_SUBCLASS_GLYPH_DEATH_KNIGHT            = 6, 
     401    ITEM_SUBCLASS_GLYPH_SHAMAN                  = 7, 
     402    ITEM_SUBCLASS_GLYPH_MAGE                    = 8, 
     403    ITEM_SUBCLASS_GLYPH_WARLOCK                 = 9, 
     404    ITEM_SUBCLASS_GLYPH_DRUID                   = 11 
     405}; 
     406 
     407#define MAX_ITEM_SUBCLASS_GLYPH                   12 
    392408 
    393409const uint32 MaxItemSubclassValues[MAX_ITEM_CLASS] = 
     
    525541    uint32 RequiredDisenchantSkill; 
    526542    float  ArmorDamageModifier; 
    527     char* ScriptName; 
     543    uint32 ScriptId; 
    528544    uint32 DisenchantID; 
    529545    uint32 FoodType; 
  • trunk/src/game/Level2.cpp

    r230 r260  
    23622362    // Check 
    23632363    // Remember: "show" must also be the name of a column! 
    2364     if( (show != "emote") && (show != "spell") && (show != "text1") && (show != "text2") 
    2365         && (show != "text3") && (show != "text4") && (show != "text5") 
     2364    if( (show != "emote") && (show != "spell") && (show != "textid1") && (show != "textid2") 
     2365        && (show != "textid3") && (show != "textid4") && (show != "textid5") 
    23662366        && (show != "waittime") && (show != "del") && (show != "move") && (show != "add") 
    23672367        && (show != "model1") && (show != "model2") && (show != "orientation")) 
     
    27032703        PSendSysMessage(LANG_WAYPOINT_CREATNOTFOUND, lowguid); 
    27042704        SetSentErrorMessage(true); 
     2705        return false; 
     2706    } 
     2707 
     2708    // set in game textids not supported 
     2709    if( show == "textid1" || show == "textid2" || show == "textid3" || 
     2710        show == "textid4" || show == "textid5" ) 
     2711    { 
    27052712        return false; 
    27062713    } 
     
    28432850 
    28442851        QueryResult *result = 
    2845             WorldDatabase.PQuery( "SELECT id, point, waittime, emote, spell, text1, text2, text3, text4, text5, model1, model2 FROM creature_movement WHERE wpguid = %u", 
     2852            WorldDatabase.PQuery( "SELECT id, point, waittime, emote, spell, textid1, textid2, textid3, textid4, textid5, model1, model2 FROM creature_movement WHERE wpguid = %u", 
    28462853            target->GetGUIDLow() ); 
    28472854        if(!result) 
     
    28552862            PSendSysMessage(LANG_WAYPOINT_NOTFOUNDSEARCH, target->GetGUID()); 
    28562863 
    2857             result = WorldDatabase.PQuery( "SELECT id, point, waittime, emote, spell, text1, text2, text3, text4, text5, model1, model2 FROM creature_movement WHERE (abs(position_x - %f) <= %s ) and (abs(position_y - %f) <= %s ) and (abs(position_z - %f) <= %s )", 
     2864            result = WorldDatabase.PQuery( "SELECT id, point, waittime, emote, spell, textid1, textid2, textid3, textid4, textid5, model1, model2 FROM creature_movement WHERE (abs(position_x - %f) <= %s ) and (abs(position_y - %f) <= %s ) and (abs(position_z - %f) <= %s )", 
    28582865                target->GetPositionX(), maxDIFF, target->GetPositionY(), maxDIFF, target->GetPositionZ(), maxDIFF); 
    28592866            if(!result) 
     
    28722879            uint32 emote            = fields[3].GetUInt32(); 
    28732880            uint32 spell            = fields[4].GetUInt32(); 
    2874             const char * text1      = fields[5].GetString(); 
    2875             const char * text2      = fields[6].GetString(); 
    2876             const char * text3      = fields[7].GetString(); 
    2877             const char * text4      = fields[8].GetString(); 
    2878             const char * text5      = fields[9].GetString(); 
     2881            uint32 textid[MAX_WAYPOINT_TEXT]; 
     2882            for(int i = 0;  i < MAX_WAYPOINT_TEXT; ++i) 
     2883                textid[i]           = fields[5+i].GetUInt32(); 
    28792884            uint32 model1           = fields[10].GetUInt32(); 
    28802885            uint32 model2           = fields[11].GetUInt32(); 
     
    28892894            PSendSysMessage(LANG_WAYPOINT_INFO_EMOTE, emote); 
    28902895            PSendSysMessage(LANG_WAYPOINT_INFO_SPELL, spell); 
    2891             PSendSysMessage(LANG_WAYPOINT_INFO_TEXT, 1, text1); 
    2892             PSendSysMessage(LANG_WAYPOINT_INFO_TEXT, 2, text2); 
    2893             PSendSysMessage(LANG_WAYPOINT_INFO_TEXT, 3, text3); 
    2894             PSendSysMessage(LANG_WAYPOINT_INFO_TEXT, 4, text4); 
    2895             PSendSysMessage(LANG_WAYPOINT_INFO_TEXT, 5, text5); 
     2896            for(int i = 0;  i < MAX_WAYPOINT_TEXT; ++i) 
     2897                PSendSysMessage(LANG_WAYPOINT_INFO_TEXT, i+1, textid[i], (textid[i] ? GetTrinityString(textid[i]) : "")); 
    28962898 
    28972899        }while( result->NextRow() ); 
     
    32143216 
    32153217    QueryResult *result = WorldDatabase.PQuery( 
    3216     //          0      1           2           3           4            5       6       7         8      9      10     11     12     13     14     15 
    3217         "SELECT point, position_x, position_y, position_z, orientation, model1, model2, waittime, emote, spell, text1, text2, text3, text4, text5, id FROM creature_movement WHERE id = '%u' ORDER BY point", lowguid ); 
     3218    //          0      1           2           3           4            5       6       7         8      9      10       11       12       13       14       15 
     3219        "SELECT point, position_x, position_y, position_z, orientation, model1, model2, waittime, emote, spell, textid1, textid2, textid3, textid4, textid5, id FROM creature_movement WHERE id = '%u' ORDER BY point", lowguid ); 
    32183220 
    32193221    if (!result) 
     
    32323234 
    32333235        outfile << "INSERT INTO creature_movement "; 
    3234         outfile << "( id, point, position_x, position_y, position_z, orientation, model1, model2, waittime, emote, spell, text1, text2, text3, text4, text5 ) VALUES "; 
     3236        outfile << "( id, point, position_x, position_y, position_z, orientation, model1, model2, waittime, emote, spell, textid1, textid2, textid3, textid4, textid5 ) VALUES "; 
    32353237 
    32363238        outfile << "( "; 
     
    32573259        outfile << fields[9].GetUInt32();                   // spell 
    32583260        outfile << ", "; 
    3259         const char *tmpChar = fields[10].GetString(); 
    3260         if( !tmpChar ) 
    3261         { 
    3262             outfile << "NULL";                              // text1 
    3263         } 
    3264         else 
    3265         { 
    3266             outfile << "'"; 
    3267             outfile << tmpChar;                             // text1 
    3268             outfile << "'"; 
    3269         } 
     3261        outfile << fields[10].GetUInt32();                  // textid1 
    32703262        outfile << ", "; 
    3271         tmpChar = fields[11].GetString(); 
    3272         if( !tmpChar ) 
    3273         { 
    3274             outfile << "NULL";                              // text2 
    3275         } 
    3276         else 
    3277         { 
    3278             outfile << "'"; 
    3279             outfile << tmpChar;                             // text2 
    3280             outfile << "'"; 
    3281         } 
     3263        outfile << fields[11].GetUInt32();                  // textid2 
    32823264        outfile << ", "; 
    3283         tmpChar = fields[12].GetString(); 
    3284         if( !tmpChar ) 
    3285         { 
    3286             outfile << "NULL";                              // text3 
    3287         } 
    3288         else 
    3289         { 
    3290             outfile << "'"; 
    3291             outfile << tmpChar;                             // text3 
    3292             outfile << "'"; 
    3293         } 
     3265        outfile << fields[12].GetUInt32();                  // textid3 
    32943266        outfile << ", "; 
    3295         tmpChar = fields[13].GetString(); 
    3296         if( !tmpChar ) 
    3297         { 
    3298             outfile << "NULL";                              // text4 
    3299         } 
    3300         else 
    3301         { 
    3302             outfile << "'"; 
    3303             outfile << tmpChar;                             // text4 
    3304             outfile << "'"; 
    3305         } 
     3267        outfile << fields[13].GetUInt32();                  // textid4 
    33063268        outfile << ", "; 
    3307         tmpChar = fields[14].GetString(); 
    3308         if( !tmpChar ) 
    3309         { 
    3310             outfile << "NULL";                              // text5 
    3311         } 
    3312         else 
    3313         { 
    3314             outfile << "'"; 
    3315             outfile << tmpChar;                             // text5 
    3316             outfile << "'"; 
    3317         } 
     3269        outfile << fields[14].GetUInt32();                  // textid5 
    33183270        outfile << ");\n "; 
    33193271 
  • trunk/src/game/Level3.cpp

    r235 r260  
    136136    HandleReloadSpellScriptsCommand("a"); 
    137137    SendGlobalSysMessage("DB tables `*_scripts` reloaded."); 
     138    HandleReloadDbScriptStringCommand("a"); 
    138139    return true; 
    139140} 
     
    599600        SendGlobalSysMessage("DB table `spell_scripts` reloaded."); 
    600601 
     602    return true; 
     603} 
     604 
     605bool ChatHandler::HandleReloadDbScriptStringCommand(const char* arg) 
     606{ 
     607    sLog.outString( "Re-Loading Script strings from `db_script_string`..."); 
     608    objmgr.LoadDbScriptStrings(); 
     609    SendGlobalSysMessage("DB table `db_script_string` reloaded."); 
    601610    return true; 
    602611} 
     
    17681777        // search highest talent rank 
    17691778        uint32 spellid = 0; 
    1770         for(int rank = 4; rank >= 0; --rank) 
     1779        int rank = 4; 
     1780        for(; rank >= 0; --rank) 
    17711781        { 
    17721782            if(talentInfo->RankID[rank]!=0) 
     
    46464656} 
    46474657 
    4648 bool ChatHandler::HandleShutDownCommand(const char* args) 
     4658bool ChatHandler::HandleServerShutDownCancelCommand(const char* args) 
     4659{ 
     4660    sWorld.ShutdownCancel(); 
     4661    return true; 
     4662} 
     4663 
     4664bool ChatHandler::HandleServerShutDownCommand(const char* args) 
    46494665{ 
    46504666    if(!*args) 
    46514667        return false; 
    46524668 
    4653     if(std::string(args)=="cancel") 
    4654     { 
    4655         sWorld.ShutdownCancel(); 
     4669    char* time_str = strtok ((char*) args, " "); 
     4670    char* exitcode_str = strtok (NULL, ""); 
     4671 
     4672    int32 time = atoi (time_str); 
     4673 
     4674    ///- Prevent interpret wrong arg value as 0 secs shutdown time 
     4675    if(time == 0 && (time_str[0]!='0' || time_str[1]!='\0') || time < 0) 
     4676        return false; 
     4677 
     4678    if (exitcode_str) 
     4679    { 
     4680        int32 exitcode = atoi (exitcode_str); 
     4681 
     4682        // Handle atoi() errors 
     4683        if (exitcode == 0 && (exitcode_str[0] != '0' || exitcode_str[1] != '\0')) 
     4684            return false; 
     4685 
     4686        // Exit code should be in range of 0-125, 126-255 is used 
     4687        // in many shells for their own return codes and code > 255 
     4688        // is not supported in many others 
     4689        if (exitcode < 0 || exitcode > 125) 
     4690            return false; 
     4691 
     4692        sWorld.ShutdownServ (time, 0, exitcode); 
    46564693    } 
    46574694    else 
    4658     { 
    4659         int32 time = atoi(args); 
    4660  
    4661         ///- Prevent interpret wrong arg value as 0 secs shutdown time 
    4662         if(time == 0 && (args[0]!='0' || args[1]!='\0') || time < 0) 
     4695        sWorld.ShutdownServ(time,0,SHUTDOWN_EXIT_CODE); 
     4696    return true; 
     4697} 
     4698 
     4699bool ChatHandler::HandleServerRestartCommand(const char* args) 
     4700{ 
     4701    if(!*args) 
     4702        return false; 
     4703 
     4704    char* time_str = strtok ((char*) args, " "); 
     4705    char* exitcode_str = strtok (NULL, ""); 
     4706 
     4707    int32 time = atoi (time_str); 
     4708 
     4709    ///- Prevent interpret wrong arg value as 0 secs shutdown time 
     4710    if(time == 0 && (time_str[0]!='0' || time_str[1]!='\0') || time < 0) 
     4711        return false; 
     4712 
     4713    if (exitcode_str) 
     4714    { 
     4715        int32 exitcode = atoi (exitcode_str); 
     4716 
     4717        // Handle atoi() errors 
     4718        if (exitcode == 0 && (exitcode_str[0] != '0' || exitcode_str[1] != '\0')) 
    46634719            return false; 
    46644720 
    4665         sWorld.ShutdownServ(time); 
    4666     } 
    4667     return true; 
    4668 } 
    4669  
    4670 bool ChatHandler::HandleRestartCommand(const char* args) 
     4721        // Exit code should be in range of 0-125, 126-255 is used 
     4722        // in many shells for their own return codes and code > 255 
     4723        // is not supported in many others 
     4724        if (exitcode < 0 || exitcode > 125) 
     4725            return false; 
     4726 
     4727        sWorld.ShutdownServ (time, SHUTDOWN_MASK_RESTART, exitcode); 
     4728    } 
     4729    else 
     4730        sWorld.ShutdownServ(time, SHUTDOWN_MASK_RESTART, RESTART_EXIT_CODE); 
     4731    return true; 
     4732} 
     4733 
     4734bool ChatHandler::HandleServerIdleRestartCommand(const char* args) 
    46714735{ 
    46724736    if(!*args) 
    46734737        return false; 
    46744738 
    4675     if(std::string(args)=="cancel") 
    4676     { 
    4677         sWorld.ShutdownCancel(); 
     4739    char* time_str = strtok ((char*) args, " "); 
     4740    char* exitcode_str = strtok (NULL, ""); 
     4741 
     4742    int32 time = atoi (time_str); 
     4743 
     4744    ///- Prevent interpret wrong arg value as 0 secs shutdown time 
     4745    if(time == 0 && (time_str[0]!='0' || time_str[1]!='\0') || time < 0) 
     4746        return false; 
     4747 
     4748    if (exitcode_str) 
     4749    { 
     4750        int32 exitcode = atoi (exitcode_str); 
     4751 
     4752        // Handle atoi() errors 
     4753        if (exitcode == 0 && (exitcode_str[0] != '0' || exitcode_str[1] != '\0')) 
     4754            return false; 
     4755 
     4756        // Exit code should be in range of 0-125, 126-255 is used 
     4757        // in many shells for their own return codes and code > 255 
     4758        // is not supported in many others 
     4759        if (exitcode < 0 || exitcode > 125) 
     4760            return false; 
     4761 
     4762        sWorld.ShutdownServ (time, SHUTDOWN_MASK_RESTART|SHUTDOWN_MASK_IDLE, exitcode); 
    46784763    } 
    46794764    else 
    4680     { 
    4681         int32 time = atoi(args); 
    4682  
    4683         ///- Prevent interpret wrong arg value as 0 secs shutdown time 
    4684         if(time == 0 && (args[0]!='0' || args[1]!='\0') || time < 0) 
     4765        sWorld.ShutdownServ(time,SHUTDOWN_MASK_RESTART|SHUTDOWN_MASK_IDLE,RESTART_EXIT_CODE); 
     4766    return true; 
     4767} 
     4768 
     4769bool ChatHandler::HandleServerIdleShutDownCommand(const char* args) 
     4770{ 
     4771    if(!*args) 
     4772        return false; 
     4773 
     4774    char* time_str = strtok ((char*) args, " "); 
     4775    char* exitcode_str = strtok (NULL, ""); 
     4776 
     4777    int32 time = atoi (time_str); 
     4778 
     4779    ///- Prevent interpret wrong arg value as 0 secs shutdown time 
     4780    if(time == 0 && (time_str[0]!='0' || time_str[1]!='\0') || time < 0) 
     4781        return false; 
     4782 
     4783    if (exitcode_str) 
     4784    { 
     4785        int32 exitcode = atoi (exitcode_str); 
     4786 
     4787        // Handle atoi() errors 
     4788        if (exitcode == 0 && (exitcode_str[0] != '0' || exitcode_str[1] != '\0')) 
    46854789            return false; 
    46864790 
    4687         sWorld.ShutdownServ(time, SHUTDOWN_MASK_RESTART); 
    4688     } 
    4689     return true; 
    4690 } 
    4691  
    4692 bool ChatHandler::HandleIdleRestartCommand(const char* args) 
    4693 { 
    4694     if(!*args) 
    4695         return false; 
    4696  
    4697     if(std::string(args)=="cancel") 
    4698     { 
    4699         sWorld.ShutdownCancel(); 
     4791        // Exit code should be in range of 0-125, 126-255 is used 
     4792        // in many shells for their own return codes and code > 255 
     4793        // is not supported in many others 
     4794        if (exitcode < 0 || exitcode > 125) 
     4795            return false; 
     4796 
     4797        sWorld.ShutdownServ (time, SHUTDOWN_MASK_IDLE, exitcode); 
    47004798    } 
    47014799    else 
    4702     { 
    4703         int32 time = atoi(args); 
    4704  
    4705         ///- Prevent interpret wrong arg value as 0 secs shutdown time 
    4706         if(time == 0 && (args[0]!='0' || args[1]!='\0') || time < 0) 
    4707             return false; 
    4708  
    4709         sWorld.ShutdownServ(time,SHUTDOWN_MASK_RESTART+SHUTDOWN_MASK_IDLE); 
    4710     } 
    4711     return true; 
    4712 } 
    4713  
    4714 bool ChatHandler::HandleIdleShutDownCommand(const char* args) 
    4715 { 
    4716     if(!*args) 
    4717         return false; 
    4718  
    4719     if(std::string(args)=="cancel") 
    4720     { 
    4721         sWorld.ShutdownCancel(); 
    4722     } 
    4723     else 
    4724     { 
    4725         int32 time = atoi(args); 
    4726  
    4727         ///- Prevent interpret wrong arg value as 0 secs shutdown time 
    4728         if(time == 0 && (args[0]!='0' || args[1]!='\0') || time < 0) 
    4729             return false; 
    4730  
    4731         sWorld.ShutdownServ(time,SHUTDOWN_MASK_IDLE); 
    4732     } 
     4800        sWorld.ShutdownServ(time,SHUTDOWN_MASK_IDLE,SHUTDOWN_EXIT_CODE); 
    47334801    return true; 
    47344802} 
  • trunk/src/game/Mail.cpp

    r229 r260  
    1111 * This program is distributed in the hope that it will be useful, 
    1212 * but WITHOUT ANY WARRANTY; without even the implied warranty of 
    13  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 
     13 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the 
    1414 * GNU General Public License for more details. 
    1515 * 
    1616 * You should have received a copy of the GNU General Public License 
    1717 * along with this program; if not, write to the Free Software 
    18  * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA 
     18 * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307 USA 
    1919 */ 
    2020 
     
    188188                return; 
    189189            } 
    190  
    191190            if (mailItem.item->HasFlag(ITEM_FIELD_FLAGS, ITEM_FLAGS_CONJURED) || mailItem.item->GetUInt32Value(ITEM_FIELD_DURATION)) 
    192191            { 
     
    195194            } 
    196195 
    197                         if(COD && mailItem.item->HasFlag(ITEM_FIELD_FLAGS, ITEM_FLAGS_WRAPPED)) 
    198                         { 
    199                                 pl->SendMailResult(0, 0, MAIL_ERR_CANT_SEND_WRAPPED_COD); 
    200                                 return; 
    201                         } 
     196            if(COD && mailItem.item->HasFlag(ITEM_FIELD_FLAGS, ITEM_FLAGS_WRAPPED)) 
     197            { 
     198                pl->SendMailResult(0, 0, MAIL_ERR_CANT_SEND_WRAPPED_COD); 
     199                return; 
     200            } 
    202201        } 
    203202    } 
  • trunk/src/game/Map.cpp

    r257 r260  
    17141714    if (mInstance) 
    17151715    { 
    1716         i_script = mInstance->script; 
     1716        i_script_id = mInstance->script_id; 
    17171717        i_data = Script->CreateInstanceData(this); 
    17181718    } 
     
    17311731            if(data) 
    17321732            { 
    1733                 sLog.outDebug("Loading instance data for `%s` with id %u", i_script.c_str(), i_InstanceId); 
     1733                sLog.outDebug("Loading instance data for `%s` with id %u", objmgr.GetScriptName(i_script_id), i_InstanceId); 
    17341734                i_data->Load(data); 
    17351735            } 
     
    17391739    else 
    17401740    { 
    1741         sLog.outDebug("New instance data, \"%s\" ,initialized!",i_script.c_str()); 
     1741        sLog.outDebug("New instance data, \"%s\" ,initialized!", objmgr.GetScriptName(i_script_id)); 
    17421742        i_data->Initialize(); 
    17431743    } 
  • trunk/src/game/Map.h

    r257 r260  
    106106    float startLocZ; 
    107107    float startLocO; 
    108     char const* script; 
     108    uint32 script_id; 
    109109}; 
    110110 
     
    344344        void CreateInstanceData(bool load); 
    345345        bool Reset(uint8 method); 
    346         std::string GetScript() { return i_script; } 
     346        uint32 GetScriptId() { return i_script_id; } 
    347347        InstanceData* GetInstanceData() { return i_data; } 
    348348        void PermBindAllPlayers(Player *player); 
     
    356356        bool m_unloadWhenEmpty; 
    357357        InstanceData* i_data; 
    358         std::string i_script; 
    359         // only online players that are inside the instance currently 
    360         // TODO ? - use the grid instead to access the players 
    361         PlayerList i_Players; 
     358        uint32 i_script_id; 
    362359}; 
    363360 
  • trunk/src/game/MapManager.cpp

    r257 r260  
    223223} 
    224224 
    225 void MapManager::DeleteInstance(uint32 mapid, uint32 instanceId, uint8 mode) 
     225void MapManager::DeleteInstance(uint32 mapid, uint32 instanceId) 
    226226{ 
    227227    Map *m = _GetBaseMap(mapid); 
  • trunk/src/game/MapManager.h

    r206 r260  
    1111 * This program is distributed in the hope that it will be useful, 
    1212 * but WITHOUT ANY WARRANTY; without even the implied warranty of 
    13  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 
     13 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the 
    1414 * GNU General Public License for more details. 
    1515 * 
    1616 * You should have received a copy of the GNU General Public License 
    1717 * along with this program; if not, write to the Free Software 
    18  * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA 
     18 * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307 USA 
    1919 */ 
    2020 
     
    2828#include "Map.h" 
    2929#include "GridStates.h" 
     30 
    3031class Transport; 
    3132 
     
    4546        // only const version for outer users 
    4647        Map const* GetBaseMap(uint32 id) const { return const_cast<MapManager*>(this)->_GetBaseMap(id); } 
    47         void DeleteInstance(uint32 mapid, uint32 instanceId, uint8 mode); 
     48        void DeleteInstance(uint32 mapid, uint32 instanceId); 
    4849 
    4950        inline uint16 GetAreaFlag(uint32 mapid, float x, float y) const 
  • trunk/src/game/ObjectMgr.cpp

    r230 r260  
    1111 * This program is distributed in the hope that it will be useful, 
    1212 * but WITHOUT ANY WARRANTY; without even the implied warranty of 
    13  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 
     13 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the 
    1414 * GNU General Public License for more details. 
    1515 * 
    1616 * You should have received a copy of the GNU General Public License 
    1717 * along with this program; if not, write to the Free Software 
    18  * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA 
     18 * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307 USA 
    1919 */ 
    2020 
     
    2222#include "Database/DatabaseEnv.h" 
    2323#include "Database/SQLStorage.h" 
     24#include "Database/SQLStorageImpl.h" 
    2425 
    2526#include "Log.h" 
     
    117118    m_hiDoGuid          = 1; 
    118119    m_hiCorpseGuid      = 1; 
    119  
    120120    m_hiPetNumber       = 1; 
     121    m_ItemTextId        = 1; 
     122    m_mailid            = 1; 
     123    m_auctionid         = 1; 
     124    m_guildId           = 1; 
     125    m_arenaTeamId       = 1; 
    121126 
    122127    mGuildBankTabPrice.resize(GUILD_BANK_MAX_TABS); 
     
    416421 
    417422        //prepare mail data... : 
    418         uint32 itemTextId = this->CreateItemText( msgAuctionWonBody.str() ); 
     423        uint32 itemTextId = CreateItemText( msgAuctionWonBody.str() ); 
    419424 
    420425        // set owner to bidder (to prevent delete item with sender char deleting) 
     
    467472        sLog.outDebug("AuctionSalePending body string : %s", msgAuctionSalePendingBody.str().c_str()); 
    468473 
    469         uint32 itemTextId = this->CreateItemText( msgAuctionSalePendingBody.str() ); 
     474        uint32 itemTextId = CreateItemText( msgAuctionSalePendingBody.str() ); 
    470475 
    471476        WorldSession::SendMailTo(owner, MAIL_AUCTION, MAIL_STATIONERY_AUCTION, auction->location, auction->owner, msgAuctionSalePendingSubject.str(), itemTextId, NULL, 0, 0, MAIL_CHECK_MASK_AUCTION); 
     
    499504        sLog.outDebug("AuctionSuccessful body string : %s", auctionSuccessfulBody.str().c_str()); 
    500505 
    501         uint32 itemTextId = this->CreateItemText( auctionSuccessfulBody.str() ); 
     506        uint32 itemTextId = CreateItemText( auctionSuccessfulBody.str() ); 
    502507 
    503508        uint32 profit = auction->bid + auction->deposit - auctionCut; 
     
    546551        // will delete item or place to receiver mail list 
    547552        WorldSession::SendMailTo(owner, MAIL_AUCTION, MAIL_STATIONERY_AUCTION, auction->location, GUID_LOPART(owner_guid), subject.str(), 0, &mi, 0, 0, MAIL_CHECK_MASK_NONE); 
    548  
    549553    } 
    550554    // owner not found 
     
    564568void ObjectMgr::LoadCreatureLocales() 
    565569{ 
    566     mCreatureLocaleMap.clear(); 
    567      
     570    mCreatureLocaleMap.clear();                              // need for reload case 
     571 
    568572    QueryResult *result = WorldDatabase.Query("SELECT entry,name_loc1,subname_loc1,name_loc2,subname_loc2,name_loc3,subname_loc3,name_loc4,subname_loc4,name_loc5,subname_loc5,name_loc6,subname_loc6,name_loc7,subname_loc7,name_loc8,subname_loc8 FROM locales_creature"); 
    569573 
     
    624628    sLog.outString( ">> Loaded %u creature locale strings", mCreatureLocaleMap.size() ); 
    625629} 
    626  
     630    
    627631void ObjectMgr::LoadNpcOptionLocales() 
    628632{ 
     
    693697} 
    694698 
     699struct SQLCreatureLoader : public SQLStorageLoaderBase<SQLCreatureLoader> 
     700{ 
     701    template<class D> 
     702    void convert_from_str(uint32 field_pos, char *src, D &dst) 
     703    { 
     704        dst = D(objmgr.GetScriptId(src)); 
     705    } 
     706}; 
     707 
    695708void ObjectMgr::LoadCreatureTemplates() 
    696709{ 
    697     sCreatureStorage.Load(); 
     710    SQLCreatureLoader loader; 
     711    loader.Load(sCreatureStorage); 
    698712 
    699713    sLog.outString( ">> Loaded %u creature definitions", sCreatureStorage.RecordCount ); 
     
    15131527        aItem->location = fields[11].GetUInt8(); 
    15141528        //check if sold item exists 
    1515         if ( this->GetAItem( aItem->item_guidlow ) ) 
     1529        if ( GetAItem( aItem->item_guidlow ) ) 
    15161530        { 
    15171531            GetAuctionsMap( aItem->location )->AddAuction(aItem); 
     
    15331547void ObjectMgr::LoadItemLocales() 
    15341548{ 
    1535     mItemLocaleMap.clear(); 
    1536      
     1549    mItemLocaleMap.clear();                                 // need for reload case 
     1550 
    15371551    QueryResult *result = WorldDatabase.Query("SELECT entry,name_loc1,description_loc1,name_loc2,description_loc2,name_loc3,description_loc3,name_loc4,description_loc4,name_loc5,description_loc5,name_loc6,description_loc6,name_loc7,description_loc7,name_loc8,description_loc8 FROM locales_item"); 
    15381552 
     
    15951609} 
    15961610 
     1611struct SQLItemLoader : public SQLStorageLoaderBase<SQLItemLoader> 
     1612{ 
     1613    template<class D> 
     1614    void convert_from_str(uint32 field_pos, char *src, D &dst) 
     1615    { 
     1616        dst = D(objmgr.GetScriptId(src)); 
     1617    } 
     1618}; 
     1619 
    15971620void ObjectMgr::LoadItemPrototypes() 
    15981621{ 
    1599     sItemStorage.Load (); 
     1622    SQLItemLoader loader; 
     1623    loader.Load(sItemStorage); 
    16001624    sLog.outString( ">> Loaded %u item prototypes", sItemStorage.RecordCount ); 
    16011625    sLog.outString(); 
     
    25072531            if (sWorld.getConfig(CONFIG_EXPANSION) < 1 && (race == RACE_BLOODELF || race == RACE_DRAENEI)) 
    25082532                continue; 
    2509                  
     2533 
    25102534            // skip expansion classes if not playing with expansion 
    25112535            if (sWorld.getConfig(CONFIG_EXPANSION) < 2 && class_ == CLASS_DEATH_KNIGHT) 
     
    35563580void ObjectMgr::LoadQuestLocales() 
    35573581{ 
    3558     mQuestLocaleMap.clear(); 
     3582    mQuestLocaleMap.clear();                                // need for reload case 
    35593583 
    35603584    QueryResult *result = WorldDatabase.Query("SELECT entry," 
     
    37503774    scripts.clear();                                        // need for reload support 
    37513775 
    3752     QueryResult *result = WorldDatabase.PQuery( "SELECT id,delay,command,datalong,datalong2,datatext, x, y, z, o FROM %s", tablename ); 
     3776    QueryResult *result = WorldDatabase.PQuery( "SELECT id,delay,command,datalong,datalong2,dataint, x, y, z, o FROM %s", tablename ); 
    37533777 
    37543778    uint32 count = 0; 
     
    37723796        Field *fields = result->Fetch(); 
    37733797        ScriptInfo tmp; 
    3774         tmp.id = fields[0].GetUInt32(); 
    3775         tmp.delay = fields[1].GetUInt32(); 
    3776         tmp.command = fields[2].GetUInt32(); 
    3777         tmp.datalong = fields[3].GetUInt32(); 
     3798        tmp.id        = fields[0].GetUInt32(); 
     3799        tmp.delay     = fields[1].GetUInt32(); 
     3800        tmp.command   = fields[2].GetUInt32(); 
     3801        tmp.datalong  = fields[3].GetUInt32(); 
    37783802        tmp.datalong2 = fields[4].GetUInt32(); 
    3779         tmp.datatext = fields[5].GetCppString(); 
    3780         tmp.x = fields[6].GetFloat(); 
    3781         tmp.y = fields[7].GetFloat(); 
    3782         tmp.z = fields[8].GetFloat(); 
    3783         tmp.o = fields[9].GetFloat(); 
     3803        tmp.dataint   = fields[5].GetInt32(); 
     3804        tmp.x         = fields[6].GetFloat(); 
     3805        tmp.y         = fields[7].GetFloat(); 
     3806        tmp.z         = fields[8].GetFloat(); 
     3807        tmp.o         = fields[9].GetFloat(); 
    37843808 
    37853809        // generic command args check 
     
    37933817                    continue; 
    37943818                } 
     3819                if(tmp.dataint==0) 
     3820                { 
     3821                    sLog.outErrorDb("Table `%s` has invalid talk text id (dataint = %i) in SCRIPT_COMMAND_TALK for script id %u",tablename,tmp.dataint,tmp.id); 
     3822                    continue; 
     3823                } 
     3824                if(tmp.dataint < MIN_DB_SCRIPT_STRING_ID || tmp.dataint >= MAX_DB_SCRIPT_STRING_ID) 
     3825                { 
     3826                    sLog.outErrorDb("Table `%s` has out of range text id (dataint = %i expected %u-%u) in SCRIPT_COMMAND_TALK for script id %u",tablename,tmp.dataint,MIN_DB_SCRIPT_STRING_ID,MAX_DB_SCRIPT_STRING_ID,tmp.id); 
     3827                    continue; 
     3828                } 
     3829 
     3830                // if(!objmgr.GetMangosStringLocale(tmp.dataint)) will checked after db_script_string loading 
    37953831                break; 
    37963832            } 
     
    41574193void ObjectMgr::LoadPageTextLocales() 
    41584194{ 
    4159     mPageTextLocaleMap.clear(); 
    4160      
     4195    mPageTextLocaleMap.clear();                             // need for reload case 
     4196 
    41614197    QueryResult *result = WorldDatabase.Query("SELECT entry,text_loc1,text_loc2,text_loc3,text_loc4,text_loc5,text_loc6,text_loc7,text_loc8 FROM locales_page_text"); 
    41624198 
     
    42074243} 
    42084244 
     4245struct SQLInstanceLoader : public SQLStorageLoaderBase<SQLInstanceLoader> 
     4246{ 
     4247    template<class D> 
     4248    void convert_from_str(uint32 field_pos, char *src, D &dst) 
     4249    { 
     4250        dst = D(objmgr.GetScriptId(src)); 
     4251    } 
     4252}; 
     4253 
    42094254void ObjectMgr::LoadInstanceTemplate() 
    42104255{ 
    4211     sInstanceTemplate.Load(); 
     4256    SQLInstanceLoader loader; 
     4257    loader.Load(sInstanceTemplate); 
    42124258 
    42134259    for(uint32 i = 0; i < sInstanceTemplate.MaxEntry; i++) 
     
    43254371void ObjectMgr::LoadNpcTextLocales() 
    43264372{ 
    4327     mNpcTextLocaleMap.clear(); 
    4328      
     4373    mNpcTextLocaleMap.clear();                              // need for reload case 
     4374 
    43294375    QueryResult *result = WorldDatabase.Query("SELECT entry," 
    43304376        "Text0_0_loc1,Text0_1_loc1,Text1_0_loc1,Text1_1_loc1,Text2_0_loc1,Text2_1_loc1,Text3_0_loc1,Text3_1_loc1,Text4_0_loc1,Text4_1_loc1,Text5_0_loc1,Text5_1_loc1,Text6_0_loc1,Text6_1_loc1,Text7_0_loc1,Text7_1_loc1," 
     
    46234669 
    46244670        uint32 Trigger_ID      = fields[0].GetUInt32(); 
    4625         std::string scriptName = fields[1].GetCppString(); 
     4671        const char *scriptName = fields[1].GetString(); 
    46264672 
    46274673        AreaTriggerEntry const* atEntry = sAreaTriggerStore.LookupEntry(Trigger_ID); 
     
    46314677            continue; 
    46324678        } 
    4633         mAreaTriggerScripts[Trigger_ID] = scriptName; 
     4679        mAreaTriggerScripts[Trigger_ID] = GetScriptId(scriptName); 
    46344680    } while( result->NextRow() ); 
    46354681 
     
    46394685    sLog.outString( ">> Loaded %u areatrigger scripts", count ); 
    46404686} 
     4687 
    46414688uint32 ObjectMgr::GetNearestTaxiNode( float x, float y, float z, uint32 mapid ) 
    46424689{ 
     
    46974744uint16 ObjectMgr::GetTaxiMount( uint32 id, uint32 team ) 
    46984745{ 
    4699     uint32 mount_entry = 0; 
    4700     uint32 mount_id = 0; 
     4746    uint16 mount_entry = 0; 
     4747    uint16 mount_id = 0; 
    47014748 
    47024749    TaxiNodesEntry const* node = sTaxiNodesStore.LookupEntry(id); 
    4703     if (node) 
     4750    if(node) 
    47044751    { 
    47054752        if (team == ALLIANCE) mount_entry = node->alliance_mount_type; 
     
    49404987    } 
    49414988 
    4942             // find now nearest graveyard at same map 
    49434989    if(entryNear) 
    49444990        return entryNear; 
     
    51815227    { 
    51825228        m_hiCharGuid = (*result)[0].GetUInt32()+1; 
    5183  
    51845229        delete result; 
    51855230    } 
     
    51895234    { 
    51905235        m_hiCreatureGuid = (*result)[0].GetUInt32()+1; 
    5191  
    51925236        delete result; 
    51935237    } 
    51945238 
    5195     result = CharacterDatabase.Query( "SELECT MAX(id) FROM character_pet" ); 
    5196     if( result ) 
    5197     { 
    5198         m_hiPetGuid = (*result)[0].GetUInt32()+1; 
    5199  
    5200         delete result; 
    5201     } 
     5239    // pet guids are not saved to DB, set to 0 (pet guid != pet id) 
     5240    m_hiPetGuid = 0; 
    52025241 
    52035242    result = CharacterDatabase.Query( "SELECT MAX(guid) FROM item_instance" ); 
     
    52055244    { 
    52065245        m_hiItemGuid = (*result)[0].GetUInt32()+1; 
    5207  
    52085246        delete result; 
    52095247    } 
     
    52195257    { 
    52205258        m_hiGoGuid = (*result)[0].GetUInt32()+1; 
    5221  
    52225259        delete result; 
    52235260    } 
     
    52275264    { 
    52285265        m_auctionid = (*result)[0].GetUInt32()+1; 
    5229  
    52305266        delete result; 
    52315267    } 
    5232     else 
    5233     { 
    5234         m_auctionid = 0; 
    5235     } 
     5268 
    52365269    result = CharacterDatabase.Query( "SELECT MAX(id) FROM mail" ); 
    52375270    if( result ) 
    52385271    { 
    52395272        m_mailid = (*result)[0].GetUInt32()+1; 
    5240  
    52415273        delete result; 
    52425274    } 
    5243     else 
    5244     { 
    5245         m_mailid = 0; 
    5246     } 
     5275 
    52475276    result = CharacterDatabase.Query( "SELECT MAX(id) FROM item_text" ); 
    52485277    if( result ) 
    52495278    { 
    5250         m_ItemTextId = (*result)[0].GetUInt32(); 
    5251  
     5279        m_ItemTextId = (*result)[0].GetUInt32()+1; 
    52525280        delete result; 
    52535281    } 
    5254     else 
    5255         m_ItemTextId = 0; 
    52565282 
    52575283    result = CharacterDatabase.Query( "SELECT MAX(guid) FROM corpse" ); 
     
    52595285    { 
    52605286        m_hiCorpseGuid = (*result)[0].GetUInt32()+1; 
    5261  
    52625287        delete result; 
    52635288    } 
     5289 
     5290    result = CharacterDatabase.Query("SELECT MAX(arenateamid) FROM arena_team"); 
     5291    if (result) 
     5292    { 
     5293        m_arenaTeamId = (*result)[0].GetUInt32()+1; 
     5294        delete result; 
     5295    } 
     5296 
     5297    result = CharacterDatabase.Query( "SELECT MAX(guildid) FROM guild" ); 
     5298    if (result) 
     5299    { 
     5300        m_guildId = (*result)[0].GetUInt32()+1; 
     5301        delete result; 
     5302    } 
     5303} 
     5304 
     5305uint32 ObjectMgr::GenerateArenaTeamId() 
     5306{ 
     5307    if(m_arenaTeamId>=0xFFFFFFFE) 
     5308    { 
     5309        sLog.outError("Arena team ids overflow!! Can't continue, shutting down server. "); 
     5310        World::StopNow(ERROR_EXIT_CODE); 
     5311    } 
     5312    return m_arenaTeamId++; 
     5313} 
     5314 
     5315uint32 ObjectMgr::GenerateGuildId() 
     5316{ 
     5317    if(m_guildId>=0xFFFFFFFE) 
     5318    { 
     5319        sLog.outError("Guild ids overflow!! Can't continue, shutting down server. "); 
     5320        World::StopNow(ERROR_EXIT_CODE); 
     5321    } 
     5322    return m_guildId++; 
    52645323} 
    52655324 
    52665325uint32 ObjectMgr::GenerateAuctionID() 
    52675326{ 
    5268     ++m_auctionid; 
    5269     if(m_auctionid>=0xFFFFFFFF) 
     5327    if(m_auctionid>=0xFFFFFFFE) 
    52705328    { 
    52715329        sLog.outError("Auctions ids overflow!! Can't continue, shutting down server. "); 
    5272         sWorld.m_stopEvent = true; 
    5273     } 
    5274     return m_auctionid; 
     5330        World::StopNow(ERROR_EXIT_CODE); 
     5331    } 
     5332    return m_auctionid++; 
    52755333} 
    52765334 
    52775335uint32 ObjectMgr::GenerateMailID() 
    52785336{ 
    5279     ++m_mailid; 
    5280     if(m_mailid>=0xFFFFFFFF) 
     5337    if(m_mailid>=0xFFFFFFFE) 
    52815338    { 
    52825339        sLog.outError("Mail ids overflow!! Can't continue, shutting down server. "); 
    5283         sWorld.m_stopEvent = true; 
    5284     } 
    5285     return m_mailid; 
     5340        World::StopNow(ERROR_EXIT_CODE); 
     5341    } 
     5342    return m_mailid++; 
    52865343} 
    52875344 
    52885345uint32 ObjectMgr::GenerateItemTextID() 
    52895346{ 
    5290     ++m_ItemTextId; 
    5291     if(m_ItemTextId>=0xFFFFFFFF) 
     5347    if(m_ItemTextId>=0xFFFFFFFE) 
    52925348    { 
    52935349        sLog.outError("Item text ids overflow!! Can't continue, shutting down server. "); 
    5294         sWorld.m_stopEvent = true; 
    5295     } 
    5296     return m_ItemTextId; 
     5350        World::StopNow(ERROR_EXIT_CODE); 
     5351    } 
     5352    return m_ItemTextId++; 
    52975353} 
    52985354 
     
    53165372    { 
    53175373        case HIGHGUID_ITEM: 
    5318             ++m_hiItemGuid; 
    5319             if(m_hiItemGuid>=0xFFFFFFFF) 
     5374            if(m_hiItemGuid>=0xFFFFFFFE) 
    53205375            { 
    53215376                sLog.outError("Item guid overflow!! Can't continue, shutting down server. "); 
    5322                 sWorld.m_stopEvent = true; 
    5323             } 
    5324             return m_hiItemGuid; 
     5377                World::StopNow(ERROR_EXIT_CODE); 
     5378            } 
     5379            return m_hiItemGuid++; 
    53255380        case HIGHGUID_UNIT: 
    5326             ++m_hiCreatureGuid; 
    5327             if(m_hiCreatureGuid>=0x00FFFFFF) 
     5381            if(m_hiCreatureGuid>=0x00FFFFFE) 
    53285382            { 
    53295383                sLog.outError("Creature guid overflow!! Can't continue, shutting down server. "); 
    5330                 sWorld.m_stopEvent = true; 
    5331             } 
    5332             return m_hiCreatureGuid; 
     5384                World::StopNow(ERROR_EXIT_CODE); 
     5385            } 
     5386            return m_hiCreatureGuid++; 
    53335387        case HIGHGUID_PET: 
    5334             ++m_hiPetGuid; 
    5335             if(m_hiPetGuid>=0x00FFFFFF) 
     5388            if(m_hiPetGuid>=0x00FFFFFE) 
    53365389            { 
    53375390                sLog.outError("Pet guid overflow!! Can't continue, shutting down server. "); 
    5338                 sWorld.m_stopEvent = true; 
    5339             } 
    5340             return m_hiPetGuid; 
     5391                World::StopNow(ERROR_EXIT_CODE); 
     5392            } 
     5393            return m_hiPetGuid++; 
    53415394        case HIGHGUID_PLAYER: 
    5342             ++m_hiCharGuid; 
    5343             if(m_hiCharGuid>=0xFFFFFFFF) 
     5395            if(m_hiCharGuid>=0xFFFFFFFE) 
    53445396            { 
    53455397                sLog.outError("Players guid overflow!! Can't continue, shutting down server. "); 
    5346                 sWorld.m_stopEvent = true; 
    5347             } 
    5348             return m_hiCharGuid; 
     5398                World::StopNow(ERROR_EXIT_CODE); 
     5399            } 
     5400            return m_hiCharGuid++; 
    53495401        case HIGHGUID_GAMEOBJECT: 
    5350             ++m_hiGoGuid; 
    5351             if(m_hiGoGuid>=0x00FFFFFF) 
     5402            if(m_hiGoGuid>=0x00FFFFFE) 
    53525403            { 
    53535404                sLog.outError("Gameobject guid overflow!! Can't continue, shutting down server. "); 
    5354                 sWorld.m_stopEvent = true; 
    5355             } 
    5356             return m_hiGoGuid; 
     5405                World::StopNow(ERROR_EXIT_CODE); 
     5406            } 
     5407            return m_hiGoGuid++; 
    53575408        case HIGHGUID_CORPSE: 
    5358             ++m_hiCorpseGuid; 
    5359             if(m_hiCorpseGuid>=0xFFFFFFFF) 
     5409            if(m_hiCorpseGuid>=0xFFFFFFFE) 
    53605410            { 
    53615411                sLog.outError("Corpse guid overflow!! Can't continue, shutting down server. "); 
    5362                 sWorld.m_stopEvent = true; 
    5363             } 
    5364             return m_hiCorpseGuid; 
     5412                World::StopNow(ERROR_EXIT_CODE); 
     5413            } 
     5414            return m_hiCorpseGuid++; 
    53655415        case HIGHGUID_DYNAMICOBJECT: 
    5366             ++m_hiDoGuid; 
    5367             if(m_hiDoGuid>=0xFFFFFFFF) 
     5416            if(m_hiDoGuid>=0xFFFFFFFE) 
    53685417            { 
    53695418                sLog.outError("DynamicObject guid overflow!! Can't continue, shutting down server. "); 
    5370                 sWorld.m_stopEvent = true; 
    5371             } 
    5372             return m_hiDoGuid; 
     5419                World::StopNow(ERROR_EXIT_CODE); 
     5420            } 
     5421            return m_hiDoGuid++; 
    53735422        default: 
    53745423            ASSERT(0); 
     
    53815430void ObjectMgr::LoadGameObjectLocales() 
    53825431{ 
    5383     mGameObjectLocaleMap.clear(); 
    5384      
     5432    mGameObjectLocaleMap.clear();                           // need for reload case 
     5433 
    53855434    QueryResult *result = WorldDatabase.Query("SELECT entry," 
    53865435        "name_loc1,name_loc2,name_loc3,name_loc4,name_loc5,name_loc6,name_loc7,name_loc8," 
     
    54505499} 
    54515500 
     5501struct SQLGameObjectLoader : public SQLStorageLoaderBase<SQLGameObjectLoader> 
     5502{ 
     5503    template<class D> 
     5504    void convert_from_str(uint32 field_pos, char *src, D &dst) 
     5505    { 
     5506        dst = D(objmgr.GetScriptId(src)); 
     5507    } 
     5508}; 
     5509 
    54525510void ObjectMgr::LoadGameobjectInfo() 
    54535511{ 
    5454     sGOStorage.Load(); 
     5512    SQLGameObjectLoader loader; 
     5513    loader.Load(sGOStorage); 
    54555514 
    54565515    // some checks 
     
    66256684} 
    66266685 
    6627 const char* ObjectMgr::GetAreaTriggerScriptName(uint32 id) 
    6628 { 
    6629     AreaTriggerScriptMap::const_iterator i = mAreaTriggerScripts.find(id); 
     6686uint32 ObjectMgr::GetAreaTriggerScriptId(uint32 trigger_id) 
     6687{ 
     6688    AreaTriggerScriptMap::const_iterator i = mAreaTriggerScripts.find(trigger_id); 
    66306689    if(i!= mAreaTriggerScripts.end()) 
    6631         return i->second.c_str(); 
    6632     return ""; 
     6690        return i->second; 
     6691    return 0; 
    66336692} 
    66346693 
     
    66756734            return false; 
    66766735        } 
    6677                 case CONDITION_NO_AURA: 
    6678                         return !player->HasAura(value1, value2); 
    6679                 case CONDITION_ACTIVE_EVENT: 
    6680                         return gameeventmgr.IsActiveEvent(value1); 
     6736        case CONDITION_NO_AURA: 
     6737            return !player->HasAura(value1, value2); 
     6738        case CONDITION_ACTIVE_EVENT: 
     6739            return gameeventmgr.IsActiveEvent(value1); 
    66816740        default: 
    66826741            return false; 
     
    67996858            break; 
    68006859        } 
    6801                 case CONDITION_NO_AURA: 
    6802                 { 
    6803                         if(!sSpellStore.LookupEntry(value1)) 
    6804                         { 
    6805                                 sLog.outErrorDb("Aura condition requires to have non existing spell (Id: %d), skipped", value1); 
    6806                                 return false; 
    6807                         } 
    6808                         if(value2 > 2) 
    6809                         { 
    6810                                 sLog.outErrorDb("Aura condition requires to have non existing effect index (%u) (must be 0..2), skipped", value2); 
    6811                                 return false; 
    6812                         } 
    6813                         break; 
    6814                 } 
    6815                 case CONDITION_ACTIVE_EVENT: 
    6816                 { 
    6817                         GameEvent::GameEventDataMap const& events = gameeventmgr.GetEventMap(); 
    6818                         if(value1 >=events.size() || !events[value1].isValid()) 
    6819                         { 
    6820                                 sLog.outErrorDb("Active event condition requires existed event id (%u), skipped", value1); 
    6821                                 return false; 
    6822                         } 
    6823                         break; 
    6824                 } 
     6860        case CONDITION_NO_AURA: 
     6861        { 
     6862            if(!sSpellStore.LookupEntry(value1)) 
     6863            { 
     6864                sLog.outErrorDb("Aura condition requires to have non existing spell (Id: %d), skipped", value1); 
     6865                return false; 
     6866            } 
     6867            if(value2 > 2) 
     6868            { 
     6869                sLog.outErrorDb("Aura condition requires to have non existing effect index (%u) (must be 0..2), skipped", value2); 
     6870                return false; 
     6871            } 
     6872            break; 
     6873        } 
     6874        case CONDITION_ACTIVE_EVENT: 
     6875        { 
     6876            GameEvent::GameEventDataMap const& events = gameeventmgr.GetEventMap(); 
     6877            if(value1 >=events.size() || !events[value1].isValid()) 
     6878            { 
     6879                sLog.outErrorDb("Active event condition requires existed event id (%u), skipped", value1); 
     6880                return false; 
     6881            } 
     6882            break; 
     6883        } 
    68256884    } 
    68266885    return true; 
     
    69527011        if(itr->first > new_id) 
    69537012            new_id = itr->first; 
    6954      
     7013 
    69557014    // use next 
    69567015    ++new_id; 
     
    69927051void ObjectMgr::LoadTrainerSpell() 
    69937052{ 
    6994     // For reload case  
     7053    // For reload case 
    69957054    for (CacheTrainerSpellMap::iterator itr = m_mCacheTrainerSpellMap.begin(); itr != m_mCacheTrainerSpellMap.end(); ++itr) 
    69967055        itr->second.Clear(); 
     
    70837142void ObjectMgr::LoadVendors() 
    70847143{ 
    7085     // For reload case  
     7144    // For reload case 
    70867145    for (CacheVendorItemMap::iterator itr = m_mCacheVendorItemMap.begin(); itr != m_mCacheVendorItemMap.end(); ++itr) 
    70877146        itr->second.Clear(); 
     
    71907249        "SELECT id,gossip_id,npcflag,icon,action,box_money,coded,option_text,box_text " 
    71917250        "FROM npc_option"); 
     7251 
    71927252    if( !result ) 
    71937253    { 
     
    73427402} 
    73437403 
     7404void ObjectMgr::LoadScriptNames() 
     7405{ 
     7406    m_scriptNames.push_back(""); 
     7407    QueryResult *result = WorldDatabase.Query( 
     7408      "SELECT DISTINCT(ScriptName) FROM creature_template WHERE ScriptName <> '' " 
     7409      "UNION " 
     7410      "SELECT DISTINCT(ScriptName) FROM gameobject_template WHERE ScriptName <> '' " 
     7411      "UNION " 
     7412      "SELECT DISTINCT(ScriptName) FROM item_template WHERE ScriptName <> '' " 
     7413      "UNION " 
     7414      "SELECT DISTINCT(ScriptName) FROM areatrigger_scripts WHERE ScriptName <> '' " 
     7415      "UNION " 
     7416      "SELECT DISTINCT(script) FROM instance_template WHERE script <> ''"); 
     7417    if(result) 
     7418    { 
     7419        do 
     7420        { 
     7421            m_scriptNames.push_back((*result)[0].GetString()); 
     7422        } while (result->NextRow()); 
     7423        delete result; 
     7424    } 
     7425 
     7426    std::sort(m_scriptNames.begin(), m_scriptNames.end()); 
     7427} 
     7428 
     7429uint32 ObjectMgr::GetScriptId(const char *name) 
     7430{ 
     7431    // use binary search to find the script name in the sorted vector 
     7432    // assume "" is the first element 
     7433    if(!name) return 0; 
     7434    ScriptNameMap::const_iterator itr = 
     7435        std::lower_bound(m_scriptNames.begin(), m_scriptNames.end(), name); 
     7436    if(itr == m_scriptNames.end()) return 0; 
     7437    return itr - m_scriptNames.begin(); 
     7438} 
     7439 
     7440void ObjectMgr::CheckScripts(ScriptMapMap const& scripts,std::set<int32>& ids) 
     7441{ 
     7442    for(ScriptMapMap::const_iterator itrMM = scripts.begin(); itrMM != scripts.end(); ++itrMM) 
     7443    { 
     7444        for(ScriptMap::const_iterator itrM = itrMM->second.begin(); itrM != itrMM->second.end(); ++itrM) 
     7445        { 
     7446            if(itrM->second.dataint) 
     7447            { 
     7448                if(!GetTrinityStringLocale (itrM->second.dataint)) 
     7449                    sLog.outErrorDb( "Table `db_script_string` has not existed string id  %u", *itrM); 
     7450 
     7451                if(ids.count(itrM->second.dataint)) 
     7452                    ids.erase(itrM->second.dataint); 
     7453            } 
     7454        } 
     7455    } 
     7456} 
     7457 
     7458void ObjectMgr::LoadDbScriptStrings() 
     7459{ 
     7460    LoadTrinityStrings(WorldDatabase,"db_script_string",MIN_DB_SCRIPT_STRING_ID,MAX_DB_SCRIPT_STRING_ID); 
     7461 
     7462    std::set<int32> ids; 
     7463 
     7464    for(int32 i = MIN_DB_SCRIPT_STRING_ID; i < MAX_DB_SCRIPT_STRING_ID; ++i) 
     7465        if(GetTrinityStringLocale(i)) 
     7466            ids.insert(i); 
     7467 
     7468    CheckScripts(sQuestEndScripts,ids); 
     7469    CheckScripts(sQuestStartScripts,ids); 
     7470    CheckScripts(sSpellScripts,ids); 
     7471    CheckScripts(sGameObjectScripts,ids); 
     7472    CheckScripts(sEventScripts,ids); 
     7473 
     7474    for(std::set<int32>::const_iterator itr = ids.begin(); itr != ids.end(); ++itr) 
     7475        sLog.outErrorDb( "Table `db_script_string` has unused string id  %u", *itr); 
     7476} 
     7477 
    73447478// Functions for scripting access 
    7345 const char* GetAreaTriggerScriptNameById(uint32 id) 
    7346 { 
    7347     return objmgr.GetAreaTriggerScriptName(id); 
     7479uint32 GetAreaTriggerScriptId(uint32 trigger_id) 
     7480{ 
     7481    return objmgr.GetAreaTriggerScriptId(trigger_id); 
    73487482} 
    73497483 
     
    73607494    return objmgr.LoadTrinityStrings(db,table,end_value,start_value); 
    73617495} 
     7496 
     7497uint32 TRINITY_DLL_SPEC GetScriptId(const char *name) 
     7498{ 
     7499    return objmgr.GetScriptId(name); 
     7500} 
     7501 
     7502ObjectMgr::ScriptNameMap & GetScriptNames() 
     7503{ 
     7504    return objmgr.GetScriptNames(); 
     7505} 
  • trunk/src/game/ObjectMgr.h

    r206 r260  
    1111 * This program is distributed in the hope that it will be useful, 
    1212 * but WITHOUT ANY WARRANTY; without even the implied warranty of 
    13  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 
     13 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the 
    1414 * GNU General Public License for more details. 
    1515 * 
    1616 * You should have received a copy of the GNU General Public License 
    1717 * along with this program; if not, write to the Free Software 
    18  * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA 
     18 * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307 USA 
    1919 */ 
    2020 
     
    8585    uint32 datalong; 
    8686    uint32 datalong2; 
    87     std::string datatext; 
     87    int32  dataint; 
    8888    float x; 
    8989    float y; 
     
    128128 
    129129typedef UNORDERED_MAP<uint64/*(instance,guid) pair*/,time_t> RespawnTimes; 
     130 
     131 
     132// mangos string ranges 
     133#define MIN_TRINITY_STRING_ID    1 
     134#define MAX_TRINITY_STRING_ID    2000000000 
     135#define MIN_DB_SCRIPT_STRING_ID MAX_TRINITY_STRING_ID 
     136#define MAX_DB_SCRIPT_STRING_ID 2000010000 
    130137 
    131138struct TrinityStringLocale 
     
    208215    CONDITION_QUESTTAKEN            = 9,                    // quest_id     0,      for condition true while quest active. 
    209216    CONDITION_AD_COMMISSION_AURA    = 10,                   // 0            0,      for condition true while one from AD ñommission aura active 
    210         CONDITION_NO_AURA               = 11,                   // spell_id     effindex 
    211         CONDITION_ACTIVE_EVENT          = 12,                   // event_id 
     217    CONDITION_NO_AURA               = 11,                   // spell_id     effindex 
     218    CONDITION_ACTIVE_EVENT          = 12,                   // event_id 
    212219}; 
    213220 
     
    251258// NPC gossip text id 
    252259typedef UNORDERED_MAP<uint32, uint32> CacheNpcTextIdMap; 
    253  
     260typedef std::list<GossipOption> CacheNpcOptionList; 
    254261 
    255262typedef UNORDERED_MAP<uint32, VendorItemData> CacheVendorItemMap; 
     
    300307        typedef UNORDERED_MAP<uint32, Quest*> QuestMap; 
    301308 
     309 
    302310        typedef UNORDERED_MAP<uint32, AreaTrigger> AreaTriggerMap; 
    303311 
    304         typedef UNORDERED_MAP<uint32, std::string> AreaTriggerScriptMap; 
     312        typedef UNORDERED_MAP<uint32, uint32> AreaTriggerScriptMap; 
    305313 
    306314        typedef UNORDERED_MAP<uint32, ReputationOnKillEntry> RepOnKillMap; 
     
    309317 
    310318        typedef UNORDERED_MAP<uint32, PetCreateSpellEntry> PetCreateSpellMap; 
     319 
     320        typedef std::vector<std::string> ScriptNameMap; 
    311321 
    312322        Player* GetPlayer(const char* name) const { return ObjectAccessor::Instance().FindPlayerByName(name);} 
     
    477487        AreaTrigger const* GetGoBackTrigger(uint32 Map) const; 
    478488 
    479         const char* GetAreaTriggerScriptName(uint32 id); 
     489        uint32 GetAreaTriggerScriptId(uint32 trigger_id); 
    480490 
    481491        ReputationOnKillEntry const* GetReputationOnKilEntry(uint32 id) const 
     
    523533 
    524534        bool LoadTrinityStrings(DatabaseType& db, char const* table, int32 min_value, int32 max_value); 
    525         bool LoadTrinityStrings() { return LoadTrinityStrings(WorldDatabase,"trinity_string",1,std::numeric_limits<int32>::max()); } 
     535        bool LoadTrinityStrings() { return LoadTrinityStrings(WorldDatabase,"trinity_string",MIN_TRINITY_STRING_ID,MAX_TRINITY_STRING_ID); } 
     536        void LoadDbScriptStrings(); 
    526537        void LoadPetCreateSpells(); 
    527538        void LoadCreatureLocales(); 
     
    593604        uint32 GenerateItemTextID(); 
    594605        uint32 GeneratePetNumber(); 
     606        uint32 GenerateArenaTeamId(); 
     607        uint32 GenerateGuildId(); 
    595608         
    596609        void LoadPlayerInfoInCache(); 
     
    669682            return &itr->second; 
    670683        } 
    671          
    672684        NpcOptionLocale const* GetNpcOptionLocale(uint32 entry) const 
    673685        { 
     
    694706        const char *GetTrinityString(int32 entry, int locale_idx) const; 
    695707        const char *GetTrinityStringForDBCLocale(int32 entry) const { return GetTrinityString(entry,DBCLocaleIndex); } 
    696                 int32 GetDBCLocaleIndex() const { return DBCLocaleIndex; } 
     708        int32 GetDBCLocaleIndex() const { return DBCLocaleIndex; } 
    697709        void SetDBCLocaleIndex(uint32 lang) { DBCLocaleIndex = GetIndexForLocale(LocaleConstant(lang)); } 
    698710 
     
    733745        LocaleConstant GetLocaleForIndex(int i); 
    734746        // guild bank tabs 
    735         const uint32 GetGuildBankTabPrice(uint8 Index) { return Index < GUILD_BANK_MAX_TABS ? mGuildBankTabPrice[Index] : 0; } 
     747        uint32 GetGuildBankTabPrice(uint8 Index) const { return Index < GUILD_BANK_MAX_TABS ? mGuildBankTabPrice[Index] : 0; } 
    736748 
    737749        uint16 GetConditionId(ConditionType condition, uint32 value1, uint32 value2); 
     
    754766        bool AddGameTele(GameTele& data); 
    755767        bool DeleteGameTele(std::string name); 
    756          
     768 
    757769        CacheNpcOptionList const& GetNpcOptions() const { return m_mCacheNpcOptionList; } 
    758770 
     
    762774            if(iter == m_mCacheNpcTextIdMap.end()) 
    763775                return 0; 
    764              
     776 
    765777            return iter->second; 
    766778        } 
     
    783795            return &iter->second; 
    784796        } 
    785         void AddVendorItem(uint32 entry,uint32 item, uint32 maxcount, uint32 incrtime, uint32 ExtendedCost, bool savetodb = true); 
    786         bool RemoveVendorItem(uint32 entry,uint32 item, bool savetodb = true); 
    787         bool IsVendorItemValid( uint32 vendor_entry, uint32 item, uint32 maxcount, uint32 ptime, uint32 ExtendedCost, Player* pl = NULL, std::set<uint32>* skip_vendors = NULL, uint32 ORnpcflag = 0) const; 
    788  
     797        void AddVendorItem(uint32 entry,uint32 item, uint32 maxcount, uint32 incrtime, uint32 ExtendedCost, bool savetodb = true); // for event 
     798        bool RemoveVendorItem(uint32 entry,uint32 item, bool savetodb = true); // for event 
     799        bool IsVendorItemValid( uint32 vendor_entry, uint32 item, uint32 maxcount, uint32 ptime, uint32 ExtendedCost, Player* pl = NULL, std::set<uint32>* skip_vendors = NULL, uint32 ORnpcflag = 0 ) const; 
     800 
     801        void LoadScriptNames(); 
     802        ScriptNameMap &GetScriptNames() { return m_scriptNames; } 
     803        const char * GetScriptName(uint32 id) { return id < m_scriptNames.size() ? m_scriptNames[id].c_str() : ""; } 
     804        uint32 GetScriptId(const char *name); 
    789805    protected: 
     806 
     807        // first free id for selected id type 
    790808        uint32 m_auctionid; 
    791809        uint32 m_mailid; 
    792810        uint32 m_ItemTextId; 
    793  
     811        uint32 m_arenaTeamId; 
     812        uint32 m_guildId; 
     813        uint32 m_hiPetNumber; 
     814 
     815        // first free low guid for seelcted guid type 
    794816        uint32 m_hiCharGuid; 
    795817        uint32 m_hiCreatureGuid; 
     
    800822        uint32 m_hiCorpseGuid; 
    801823 
    802         uint32 m_hiPetNumber; 
    803  
    804         QuestMap mQuestTemplates; 
     824        QuestMap            mQuestTemplates; 
    805825 
    806826        typedef UNORDERED_MAP<uint32, GossipText*> GossipTextMap; 
     
    849869        GameTeleMap         m_GameTeleMap; 
    850870 
     871        ScriptNameMap       m_scriptNames; 
     872 
    851873        typedef             std::vector<LocaleConstant> LocalForIndex; 
    852874        LocalForIndex        m_LocalForIndex; 
     
    856878    private: 
    857879        void LoadScripts(ScriptMapMap& scripts, char const* tablename); 
     880        void CheckScripts(ScriptMapMap const& scripts,std::set<int32>& ids); 
    858881        void ConvertCreatureAddonAuras(CreatureDataAddon* addon, char const* table, char const* guidEntryStr); 
    859882        void LoadQuestRelationsHelper(QuestRelations& map,char const* table); 
     
    908931 
    909932// scripting access functions 
    910 bool TRINITY_DLL_SPEC LoadTrinityStrings(DatabaseType& db, char const* table,int32 start_value = -1, int32 end_value = std::numeric_limits<int32>::min()); 
    911 TRINITY_DLL_SPEC const char* GetAreaTriggerScriptNameById(uint32 id); 
     933TRINITY_DLL_SPEC bool LoadTrinityStrings(DatabaseType& db, char const* table,int32 start_value = -1, int32 end_value = std::numeric_limits<int32>::min()); 
     934TRINITY_DLL_SPEC uint32 GetAreaTriggerScriptId(uint32 trigger_id); 
     935TRINITY_DLL_SPEC uint32 GetScriptId(const char *name); 
     936TRINITY_DLL_SPEC ObjectMgr::ScriptNameMap& GetScriptNames(); 
    912937 
    913938#endif 
  • trunk/src/game/PlayerDump.cpp

    r112 r260  
    1111 * This program is distributed in the hope that it will be useful, 
    1212 * but WITHOUT ANY WARRANTY; without even the implied warranty of 
    13  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 
     13 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the 
    1414 * GNU General Public License for more details. 
    1515 * 
    1616 * You should have received a copy of the GNU General Public License 
    1717 * along with this program; if not, write to the Free Software 
    18  * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA 
     18 * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307 USA 
    1919 */ 
    2020 
     
    278278    // for guid set stop if set is empty 
    279279    if(guids && guids->empty()) 
    280         return;                                        // nothing to do 
     280        return;                                             // nothing to do 
    281281 
    282282    // setup for guids case start position 
     
    344344    FILE *fout = fopen(file.c_str(), "w"); 
    345345    if (!fout) 
    346                 return DUMP_FILE_OPEN_ERROR; 
     346        return DUMP_FILE_OPEN_ERROR; 
    347347 
    348348    std::string dump = GetDump(guid); 
     
    372372        } 
    373373    } 
     374 
    374375    FILE *fin = fopen(file.c_str(), "r"); 
    375376    if(!fin) 
    376                 return DUMP_FILE_OPEN_ERROR; 
     377        return DUMP_FILE_OPEN_ERROR; 
    377378 
    378379    QueryResult * result = NULL; 
     
    391392        else incHighest = false; 
    392393    } 
    393     else guid = objmgr.m_hiCharGuid; 
     394    else 
     395        guid = objmgr.m_hiCharGuid; 
    394396 
    395397    // normalize the name if specified and check if it exists 
     
    469471            case DTT_CHAR_TABLE: 
    470472                if(!changenth(line, 1, newguid)) 
    471                                         ROLLBACK(DUMP_FILE_BROKEN); 
     473                    ROLLBACK(DUMP_FILE_BROKEN); 
    472474                break; 
    473475 
     
    475477            { 
    476478                if(!changenth(line, 1, newguid)) 
    477                                         ROLLBACK(DUMP_FILE_BROKEN); 
     479                    ROLLBACK(DUMP_FILE_BROKEN); 
    478480 
    479481                // guid, data field:guid, items 
    480482                if(!changenth(line, 2, chraccount)) 
    481                                         ROLLBACK(DUMP_FILE_BROKEN); 
    482  
     483                    ROLLBACK(DUMP_FILE_BROKEN); 
    483484                std::string vals = getnth(line, 3); 
    484485                if(!changetoknth(vals, OBJECT_FIELD_GUID+1, newguid)) 
    485                                         ROLLBACK(DUMP_FILE_BROKEN); 
    486  
     486                    ROLLBACK(DUMP_FILE_BROKEN); 
    487487                for(uint16 field = PLAYER_FIELD_INV_SLOT_HEAD; field < PLAYER_FARSIGHT; field++) 
    488488                    if(!changetokGuid(vals, field+1, items, objmgr.m_hiItemGuid, true)) 
    489                                                 ROLLBACK(DUMP_FILE_BROKEN); 
    490  
     489                        ROLLBACK(DUMP_FILE_BROKEN); 
    491490                if(!changenth(line, 3, vals.c_str())) 
    492                                         ROLLBACK(DUMP_FILE_BROKEN); 
    493  
     491                    ROLLBACK(DUMP_FILE_BROKEN); 
    494492                if (name == "") 
    495493                { 
     
    504502                                                            // rename on login: `at_login` field 30 in raw field list 
    505503                        if(!changenth(line, 30, "1")) 
    506                                                         ROLLBACK(DUMP_FILE_BROKEN); 
     504                            ROLLBACK(DUMP_FILE_BROKEN); 
    507505                    } 
    508506                } 
    509507                else if(!changenth(line, 4, name.c_str())) 
    510                                         ROLLBACK(DUMP_FILE_BROKEN); 
     508                    ROLLBACK(DUMP_FILE_BROKEN); 
    511509 
    512510                break; 
     
    515513            { 
    516514                if(!changenth(line, 1, newguid)) 
    517                                         ROLLBACK(DUMP_FILE_BROKEN); 
     515                    ROLLBACK(DUMP_FILE_BROKEN); 
    518516 
    519517                // bag, item 
    520518                if(!changeGuid(line, 2, items, objmgr.m_hiItemGuid, true)) 
    521                                         ROLLBACK(DUMP_FILE_BROKEN); 
    522                                 if(!changeGuid(line, 4, items, objmgr.m_hiItemGuid)) 
    523                                         ROLLBACK(DUMP_FILE_BROKEN); 
     519                    ROLLBACK(DUMP_FILE_BROKEN); 
     520                if(!changeGuid(line, 4, items, objmgr.m_hiItemGuid)) 
     521                    ROLLBACK(DUMP_FILE_BROKEN); 
    524522                break; 
    525523            } 
     
    528526                // item, owner, data field:item, owner guid 
    529527                if(!changeGuid(line, 1, items, objmgr.m_hiItemGuid)) 
    530                                         ROLLBACK(DUMP_FILE_BROKEN); 
    531                                 if(!changenth(line, 2, newguid)) 
    532                                         ROLLBACK(DUMP_FILE_BROKEN); 
    533  
     528                    ROLLBACK(DUMP_FILE_BROKEN); 
     529                if(!changenth(line, 2, newguid)) 
     530                    ROLLBACK(DUMP_FILE_BROKEN); 
    534531                std::string vals = getnth(line,3); 
    535532                if(!changetokGuid(vals, OBJECT_FIELD_GUID+1, items, objmgr.m_hiItemGuid)) 
    536                                         ROLLBACK(DUMP_FILE_BROKEN); 
    537                                 if(!changetoknth(vals, ITEM_FIELD_OWNER+1, newguid)) 
    538                                         ROLLBACK(DUMP_FILE_BROKEN); 
    539                                 if(!changenth(line, 3, vals.c_str())) 
    540                                         ROLLBACK(DUMP_FILE_BROKEN); 
     533                    ROLLBACK(DUMP_FILE_BROKEN); 
     534                if(!changetoknth(vals, ITEM_FIELD_OWNER+1, newguid)) 
     535                    ROLLBACK(DUMP_FILE_BROKEN); 
     536                if(!changenth(line, 3, vals.c_str())) 
     537                    ROLLBACK(DUMP_FILE_BROKEN); 
    541538                break; 
    542539            } 
     
    545542                // guid,item_guid, 
    546543                if(!changenth(line, 1, newguid)) 
    547                                         ROLLBACK(DUMP_FILE_BROKEN); 
    548                                 if(!changeGuid(line, 2, items, objmgr.m_hiItemGuid)) 
    549                                         ROLLBACK(DUMP_FILE_BROKEN); 
     544                    ROLLBACK(DUMP_FILE_BROKEN); 
     545                if(!changeGuid(line, 2, items, objmgr.m_hiItemGuid)) 
     546                    ROLLBACK(DUMP_FILE_BROKEN); 
    550547                break; 
    551548            } 
     
    570567                // item, entry, owner, ... 
    571568                if(!changenth(line, 1, newpetid)) 
    572                                         ROLLBACK(DUMP_FILE_BROKEN); 
    573                                 if(!changenth(line, 3, newguid)) 
    574                                         ROLLBACK(DUMP_FILE_BROKEN); 
     569                    ROLLBACK(DUMP_FILE_BROKEN); 
     570                if(!changenth(line, 3, newguid)) 
     571                    ROLLBACK(DUMP_FILE_BROKEN); 
    575572 
    576573                break; 
     
    583580                std::map<uint32, uint32> :: const_iterator petids_iter = petids.find(atoi(currpetid)); 
    584581                if(petids_iter == petids.end())             // couldn't find new inserted id 
    585                                         ROLLBACK(DUMP_FILE_BROKEN); 
     582                    ROLLBACK(DUMP_FILE_BROKEN); 
    586583 
    587584                snprintf(newpetid, 20, "%d", petids_iter->second); 
    588585 
    589586                if(!changenth(line, 1, newpetid)) 
    590                                         ROLLBACK(DUMP_FILE_BROKEN); 
     587                    ROLLBACK(DUMP_FILE_BROKEN); 
    591588 
    592589                break; 
     
    596593                // id,messageType,stationery,sender,receiver 
    597594                if(!changeGuid(line, 1, mails, objmgr.m_mailid)) 
    598                                         ROLLBACK(DUMP_FILE_BROKEN); 
    599                                 if(!changenth(line, 5, newguid)) 
    600                                         ROLLBACK(DUMP_FILE_BROKEN); 
     595                    ROLLBACK(DUMP_FILE_BROKEN); 
     596                if(!changenth(line, 5, newguid)) 
     597                    ROLLBACK(DUMP_FILE_BROKEN); 
    601598                break; 
    602599            } 
     
    605602                // mail_id,item_guid,item_template,receiver 
    606603                if(!changeGuid(line, 1, mails, objmgr.m_mailid)) 
    607                                         ROLLBACK(DUMP_FILE_BROKEN); 
    608                                 if(!changeGuid(line, 2, items, objmgr.m_hiItemGuid)) 
    609                                         ROLLBACK(DUMP_FILE_BROKEN); 
    610                                 if(!changenth(line, 4, newguid)) 
    611                                         ROLLBACK(DUMP_FILE_BROKEN); 
     604                    ROLLBACK(DUMP_FILE_BROKEN); 
     605                if(!changeGuid(line, 2, items, objmgr.m_hiItemGuid)) 
     606                    ROLLBACK(DUMP_FILE_BROKEN); 
     607                if(!changenth(line, 4, newguid)) 
     608                    ROLLBACK(DUMP_FILE_BROKEN); 
    612609                break; 
    613610            } 
     
    618615 
    619616        if(!CharacterDatabase.Execute(line.c_str())) 
    620                         ROLLBACK(DUMP_FILE_BROKEN); 
     617            ROLLBACK(DUMP_FILE_BROKEN); 
    621618    } 
    622619 
  • trunk/src/game/SpellHandler.cpp

    r252 r260  
    1111 * This program is distributed in the hope that it will be useful, 
    1212 * but WITHOUT ANY WARRANTY; without even the implied warranty of 
    13  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 
     13 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the 
    1414 * GNU General Public License for more details. 
    1515 * 
    1616 * You should have received a copy of the GNU General Public License 
    1717 * along with this program; if not, write to the Free Software 
    18  * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA 
     18 * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307 USA 
    1919 */ 
    2020 
     
    5555    } 
    5656 
     57    if(pItem->GetGUID() != item_guid) 
     58    { 
     59        pUser->SendEquipError(EQUIP_ERR_ITEM_NOT_FOUND, NULL, NULL ); 
     60        return; 
     61    } 
     62 
    5763    sLog.outDetail("WORLD: CMSG_USE_ITEM packet, bagIndex: %u, slot: %u, spell_count: %u , cast_count: %u, Item: %u, data length = %i", bagIndex, slot, spell_count, cast_count, pItem->GetEntry(), recvPacket.size()); 
    5864 
     
    238244 
    239245            pItem->SetUInt64Value(ITEM_FIELD_GIFTCREATOR, 0); 
    240             pItem->SetUInt32Value(OBJECT_FIELD_ENTRY, entry); 
     246            pItem->SetEntry(entry); 
    241247            pItem->SetUInt32Value(ITEM_FIELD_FLAGS, flags); 
    242248            pItem->SetState(ITEM_CHANGED, pUser); 
     
    260266 
    261267    uint64 guid; 
    262     uint32 spellId = OPEN_CHEST; 
    263268 
    264269    recv_data >> guid; 
     
    323328 
    324329    Spell *spell = new Spell(_player, spellInfo, false); 
    325     spell->m_cast_count = cast_count;                       //set count of casts 
     330    spell->m_cast_count = cast_count;                       // set count of casts 
    326331    spell->prepare(&targets); 
    327332} 
  • trunk/src/game/WaypointManager.cpp

    r207 r260  
    1111 * This program is distributed in the hope that it will be useful, 
    1212 * but WITHOUT ANY WARRANTY; without even the implied warranty of 
    13  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 
     13 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the 
    1414 * GNU General Public License for more details. 
    1515 * 
    1616 * You should have received a copy of the GNU General Public License 
    1717 * along with this program; if not, write to the Free Software 
    18  * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA 
     18 * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307 USA 
    1919 */ 
    2020 
     
    2525#include "ProgressBar.h" 
    2626#include "MapManager.h" 
     27#include "ObjectMgr.h" 
    2728 
    2829INSTANTIATE_SINGLETON_1(WaypointManager); 
     
    3031bool WaypointBehavior::isEmpty() 
    3132{ 
    32     return emote == 0 && spell == 0 && model1 == 0 && model2 == 0 && text[0].empty() && 
    33         text[1].empty() && text[2].empty() && text[3].empty() && text[4].empty(); 
     33    if (emote || spell || model1 || model2) 
     34        return false; 
     35 
     36    for(int i = 0; i < MAX_WAYPOINT_TEXT; ++i) 
     37        if(textid[i]) 
     38            return false; 
     39 
     40    return true; 
    3441} 
    3542 
    3643WaypointBehavior::WaypointBehavior(const WaypointBehavior &b) 
    3744{ 
    38     emote = b.emote; spell = b.spell; model1 = b.model1; model2 = b.model2; 
    39     text[0] = b.text[0]; text[1] = b.text[1]; text[2] = b.text[2]; 
    40     text[3] = b.text[3]; text[4] = b.text[4]; 
     45    emote = b.emote; 
     46    spell = b.spell; 
     47    model1 = b.model1; 
     48    model2 = b.model2; 
     49    for(int i=0; i < MAX_WAYPOINT_TEXT; ++i) 
     50        textid[i] = b.textid[i]; 
    4151} 
    4252 
     
    6777    } 
    6878 
    69     result = WorldDatabase.Query("SELECT position_x, position_y, position_z, orientation, model1, model2, waittime, emote, spell, text1, text2, text3, text4, text5, id, point FROM creature_movement"); 
     79    result = WorldDatabase.Query("SELECT position_x, position_y, position_z, orientation, model1, model2, waittime, emote, spell, textid1, textid2, textid3, textid4, textid5, id, point FROM creature_movement"); 
    7080    if(result) 
    7181    { 
     
    114124            be.emote            = fields[7].GetUInt32(); 
    115125            be.spell            = fields[8].GetUInt32(); 
    116             be.text[0]          = fields[9].GetCppString(); 
    117             be.text[1]          = fields[10].GetCppString(); 
    118             be.text[2]          = fields[11].GetCppString(); 
    119             be.text[3]          = fields[12].GetCppString(); 
    120             be.text[4]          = fields[13].GetCppString(); 
     126 
     127            // load and store without holes in array 
     128            int j = 0; 
     129            for(int i = 0; i < MAX_WAYPOINT_TEXT; ++i) 
     130            { 
     131                be.textid[j]        = fields[9+i].GetUInt32(); 
     132                if(be.textid[j]) 
     133                { 
     134                    if (be.textid[j] < MIN_DB_SCRIPT_STRING_ID || be.textid[j] >= MAX_DB_SCRIPT_STRING_ID) 
     135                    { 
     136                        sLog.outErrorDb( "Table `db_script_string` not have string id  %u", be.textid[j]); 
     137                        continue; 
     138                    } 
     139 
     140                    if (!objmgr.GetTrinityStringLocale (be.textid[j])) 
     141                    { 
     142                        sLog.outErrorDb("ERROR: Waypoint path %d (point %d), have invalid text id (%i) in `textid%d, ignored.", 
     143                            id, point, be.textid[j], i+1); 
     144                        continue; 
     145                    } 
     146 
     147                    ++j;                                    // to next internal field 
     148                } 
     149            } 
     150            // fill array tail 
     151            for(; j < MAX_WAYPOINT_TEXT; ++j) 
     152                be.textid[j] = 0; 
    121153 
    122154            // save memory by not storing empty behaviors 
     
    266298        if(!node.behavior) node.behavior = new WaypointBehavior(); 
    267299 
    268         if(field == "text1") node.behavior->text[0] = text ? text : ""; 
    269         if(field == "text2") node.behavior->text[1] = text ? text : ""; 
    270         if(field == "text3") node.behavior->text[2] = text ? text : ""; 
    271         if(field == "text4") node.behavior->text[3] = text ? text : ""; 
    272         if(field == "text5") node.behavior->text[4] = text ? text : ""; 
     300//        if(field == "text1") node.behavior->text[0] = text ? text : ""; 
     301//        if(field == "text2") node.behavior->text[1] = text ? text : ""; 
     302//        if(field == "text3") node.behavior->text[2] = text ? text : ""; 
     303//        if(field == "text4") node.behavior->text[3] = text ? text : ""; 
     304//        if(field == "text5") node.behavior->text[4] = text ? text : ""; 
    273305        if(field == "emote") node.behavior->emote   = text ? atoi(text) : 0; 
    274306        if(field == "spell") node.behavior->spell   = text ? atoi(text) : 0; 
  • trunk/src/game/WaypointManager.h

    r206 r260  
    2626#include "Utilities/UnorderedMap.h" 
    2727 
     28#define MAX_WAYPOINT_TEXT 5 
    2829struct WaypointBehavior 
    2930{ 
    3031    uint32 emote; 
    3132    uint32 spell; 
    32     std::string text[5]; 
     33    int32  textid[MAX_WAYPOINT_TEXT]; 
    3334    uint32 model1; 
    3435    uint32 model2; 
  • trunk/src/game/WaypointMovementGenerator.cpp

    r229 r260  
    2222creature_movement Table 
    2323 
    24 alter table creature_movement add `text1` varchar(255) default NULL; 
    25 alter table creature_movement add `text2` varchar(255) default NULL; 
    26 alter table creature_movement add `text3` varchar(255) default NULL; 
    27 alter table creature_movement add `text4` varchar(255) default NULL; 
    28 alter table creature_movement add `text5` varchar(255) default NULL; 
     24alter table creature_movement add `textid1` int(11) NOT NULL default '0'; 
     25alter table creature_movement add `textid2` int(11) NOT NULL default '0'; 
     26alter table creature_movement add `textid3` int(11) NOT NULL default '0'; 
     27alter table creature_movement add `textid4` int(11) NOT NULL default '0'; 
     28alter table creature_movement add `textid5` int(11) NOT NULL default '0'; 
    2929alter table creature_movement add `emote` int(10) unsigned default '0'; 
    3030alter table creature_movement add `spell` int(5) unsigned default '0'; 
     
    149149                if(behavior->model1 != 0) 
    150150                    creature.SetDisplayId(behavior->model1); 
    151                 if(!behavior->text[0].empty()) 
     151                if(behavior->textid[0]) 
    152152                { 
    153                     // Only one text is set 
    154                     if( !behavior->text[1].empty() ) 
     153                    // Not only one text is set 
     154                    if( behavior->textid[1] ) 
    155155                    { 
    156156                        // Select one from max 5 texts (0 and 1 already checked) 
    157157                        int i = 2; 
    158                         for( ; i < 5; ++i ) 
    159                             if( behavior->text[i].empty() ) 
     158                        for( ; i < MAX_WAYPOINT_TEXT; ++i ) 
     159                            if( !behavior->textid[i] ) 
    160160                                break; 
    161161 
    162                         creature.Say(behavior->text[rand() % i].c_str(), 0, 0); 
    163  
     162                        creature.Say(behavior->textid[rand() % i], 0, 0); 
    164163                    } 
    165164                    else 
    166                         creature.Say(behavior->text[0].c_str(), 0, 0); 
     165                        creature.Say(behavior->textid[0], 0, 0); 
    167166                } 
    168167            }                                               // wpBehaviour found 
  • trunk/src/game/World.cpp

    r230 r260  
    1111 * This program is distributed in the hope that it will be useful, 
    1212 * but WITHOUT ANY WARRANTY; without even the implied warranty of 
    13  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 
     13 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the 
    1414 * GNU General Public License for more details. 
    1515 * 
    1616 * You should have received a copy of the GNU General Public License 
    1717 * along with this program; if not, write to the Free Software 
    18  * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA 
     18 * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307 USA 
    1919 */ 
    2020 
     
    6767 
    6868volatile bool World::m_stopEvent = false; 
     69uint8 World::m_ExitCode = SHUTDOWN_EXIT_CODE; 
    6970volatile uint32 World::m_worldLoopCounter = 0; 
    7071 
     
    543544        m_configs[CONFIG_SOCKET_SELECTTIME] = sConfig.GetIntDefault("SocketSelectTime", DEFAULT_SOCKET_SELECT_TIME); 
    544545 
    545  
    546546    m_configs[CONFIG_GROUP_XP_DISTANCE] = sConfig.GetIntDefault("MaxGroupXPDistance", 74); 
    547547    /// \todo Add MonsterSight and GuarderSight (with meaning) in Trinityd.conf or put them as define 
     
    606606    } 
    607607 
    608  
    609608    if(reload) 
    610609    { 
     
    770769    m_configs[CONFIG_THREAT_RADIUS] = sConfig.GetIntDefault("ThreatRadius", 100); 
    771770 
    772     // always use declined names in the Russian client 
    773     m_configs[CONFIG_DECLINED_NAMES_USED] =  
     771    // always use declined names in the russian client 
     772    m_configs[CONFIG_DECLINED_NAMES_USED] = 
    774773        (m_configs[CONFIG_REALM_ZONE] == REALM_ZONE_RUSSIAN) ? true : sConfig.GetBoolDefault("DeclinedNames", false); 
    775774 
     
    966965    DetectDBCLang(); 
    967966 
     967    sLog.outString( "Loading Script Names..."); 
     968    objmgr.LoadScriptNames(); 
     969 
    968970    sLog.outString( "Loading InstanceTemplate" ); 
    969971    objmgr.LoadInstanceTemplate(); 
     
    10811083    sLog.outString( "Loading Tavern Area Triggers..." ); 
    10821084    objmgr.LoadTavernAreaTriggers(); 
    1083      
     1085 
    10841086    sLog.outString( "Loading AreaTrigger script names..." ); 
    10851087    objmgr.LoadAreaTriggerScripts(); 
    1086  
    10871088 
    10881089    sLog.outString( "Loading Graveyard-zone links..."); 
     
    11651166    sLog.outString( "Loading Npc Text Id..." ); 
    11661167    objmgr.LoadNpcTextId();                                 // must be after load Creature and NpcText 
    1167      
     1168 
    11681169    sLog.outString( "Loading Npc Options..." ); 
    11691170    objmgr.LoadNpcOptions(); 
     
    11931194    objmgr.LoadEventScripts();                              // must be after load Creature/Gameobject(Template/Data) 
    11941195 
     1196    sLog.outString( "Loading Scripts text locales..." );    // must be after Load*Scripts calls 
     1197    objmgr.LoadDbScriptStrings(); 
     1198 
    11951199    sLog.outString( "Initializing Scripts..." ); 
    11961200    if(!LoadScriptingModule()) 
     
    12631267    sLog.outString( "WORLD: World initialized" ); 
    12641268} 
     1269 
    12651270void World::DetectDBCLang() 
    12661271{ 
     
    14631468    } 
    14641469 
    1465     MapManager::Instance().DoDelayedMovesAndRemoves(); ///- Move all creatures with "delayed move" and remove and delete all objects with "delayed remove" 
     1470    /// </ul> 
     1471    ///- Move all creatures with "delayed move" and remove and delete all objects with "delayed remove" 
     1472    MapManager::Instance().DoDelayedMovesAndRemoves(); 
    14661473 
    14671474    // update the instance reset times 
     
    15831590        } 
    15841591 
     1592        //if(source && !source->IsInWorld()) source = NULL; 
     1593 
    15851594        Object* target = NULL; 
    15861595 
     
    16101619        } 
    16111620 
     1621        //if(target && !target->IsInWorld()) target = NULL; 
     1622 
    16121623        switch (step.script->command) 
    16131624        { 
     
    16371648                { 
    16381649                    case 0:                                 // Say 
    1639                         ((Creature *)source)->Say(step.script->datatext.c_str(), LANG_UNIVERSAL, unit_target); 
     1650                        ((Creature *)source)->Say(step.script->dataint, LANG_UNIVERSAL, unit_target); 
    16401651                        break; 
    16411652                    case 1:                                 // Whisper 
     
    16451656                            break; 
    16461657                        } 
    1647                         ((Creature *)source)->Whisper(step.script->datatext.c_str(),unit_target); 
     1658                        ((Creature *)source)->Whisper(step.script->dataint,unit_target); 
    16481659                        break; 
    16491660                    case 2:                                 // Yell 
    1650                         ((Creature *)source)->Yell(step.script->datatext.c_str(), LANG_UNIVERSAL, unit_target); 
     1661                        ((Creature *)source)->Yell(step.script->dataint, LANG_UNIVERSAL, unit_target); 
    16511662                        break; 
    16521663                    case 3:                                 // Emote text 
    1653                         ((Creature *)source)->TextEmote(step.script->datatext.c_str(), unit_target); 
     1664                        ((Creature *)source)->TextEmote(step.script->dataint, unit_target); 
    16541665                        break; 
    16551666                    default: 
     
    17021713                } 
    17031714                ((Unit *)source)->SendMonsterMoveWithSpeed(step.script->x, step.script->y, step.script->z, ((Unit *)source)->GetUnitMovementFlags(), step.script->datalong2 ); 
    1704                 MapManager::Instance().GetMap(((Unit *)source)->GetMapId(), ((Unit *)source))->CreatureRelocation(((Creature *)source), step.script->x, step.script->y, step.script->z, 0); 
     1715                ((Unit *)source)->GetMap()->CreatureRelocation(((Creature *)source), step.script->x, step.script->y, step.script->z, 0); 
    17051716                break; 
    17061717            case SCRIPT_COMMAND_FLAG_SET: 
     
    18521863                go->SetRespawnTime(time_to_despawn);        //despawn object in ? seconds 
    18531864 
    1854                 MapManager::Instance().GetMap(go->GetMapId(), go)->Add(go); 
     1865                go->GetMap()->Add(go); 
    18551866                break; 
    18561867            } 
     
    23742385 
    23752386    ///- if there is a shutdown timer 
    2376     if(m_ShutdownTimer > 0 && elapsed > 0) 
     2387    if(!m_stopEvent && m_ShutdownTimer > 0 && elapsed > 0) 
    23772388    { 
    23782389        ///- ... and it is overdue, stop the world (set m_stopEvent) 
     
    23802391        { 
    23812392            if(!(m_ShutdownMask & SHUTDOWN_MASK_IDLE) || GetActiveAndQueuedSessionCount()==0) 
    2382                 m_stopEvent = true; 
     2393                m_stopEvent = true;                         // exist code already set 
    23832394            else 
    23842395                m_ShutdownTimer = 1;                        // minimum timer value to wait idle state 
     
    23952406 
    23962407/// Shutdown the server 
    2397 void World::ShutdownServ(uint32 time, uint32 options) 
    2398 { 
     2408void World::ShutdownServ(uint32 time, uint32 options, uint8 exitcode) 
     2409{ 
     2410    // ignore if server shutdown at next tick 
     2411    if(m_stopEvent) 
     2412        return; 
     2413 
    23992414    m_ShutdownMask = options; 
     2415    m_ExitCode = exitcode; 
    24002416 
    24012417    ///- If the shutdown time is 0, set m_stopEvent (except if shutdown is 'idle' with remaining sessions) 
     
    24032419    { 
    24042420        if(!(options & SHUTDOWN_MASK_IDLE) || GetActiveAndQueuedSessionCount()==0) 
    2405             m_stopEvent = true; 
     2421            m_stopEvent = true;                             // exist code already set 
    24062422        else 
    24072423            m_ShutdownTimer = 1;                            //So that the session count is re-evaluated at next world tick 
     
    24482464void World::ShutdownCancel() 
    24492465{ 
    2450     if(!m_ShutdownTimer) 
     2466    // nothing cancel or too later 
     2467    if(!m_ShutdownTimer || m_stopEvent) 
    24512468        return; 
    24522469 
     
    24552472    m_ShutdownMask = 0; 
    24562473    m_ShutdownTimer = 0; 
     2474    m_ExitCode = SHUTDOWN_EXIT_CODE;                       // to default value 
    24572475    SendServerMessage(msgid); 
    24582476 
    2459     DEBUG_LOG("Server %s canceled.",(m_ShutdownMask & SHUTDOWN_MASK_RESTART ? "restart" : "shuttingdown")); 
     2477    DEBUG_LOG("Server %s cancelled.",(m_ShutdownMask & SHUTDOWN_MASK_RESTART ? "restart" : "shuttingdown")); 
    24602478} 
    24612479 
     
    25022520        if(!itr->second->Update(diff))                      // As interval = 0 
    25032521        { 
     2522            RemoveQueuedPlayer (itr->second); 
    25042523            delete itr->second; 
    25052524            m_sessions.erase(itr); 
  • trunk/src/game/World.h

    r229 r260  
    1111 * This program is distributed in the hope that it will be useful, 
    1212 * but WITHOUT ANY WARRANTY; without even the implied warranty of 
    13  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 
     13 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the 
    1414 * GNU General Public License for more details. 
    1515 * 
    1616 * You should have received a copy of the GNU General Public License 
    1717 * along with this program; if not, write to the Free Software 
    18  * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA 
     18 * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307 USA 
    1919 */ 
    2020 
     
    5252}; 
    5353 
     54enum ShutdownExitCode 
     55{ 
     56    SHUTDOWN_EXIT_CODE = 0, 
     57    ERROR_EXIT_CODE    = 1, 
     58    RESTART_EXIT_CODE  = 2, 
     59}; 
     60 
    5461/// Timers for different object refresh rates 
    5562enum WorldTimers 
     
    6269    WUPDATE_CORPSES     = 5, 
    6370    WUPDATE_EVENTS      = 6, 
    64     WUPDATE_COUNT       = 7, 
    65  
     71    WUPDATE_COUNT       = 7 
    6672}; 
    6773 
     
    106112    CONFIG_INSTANCE_IGNORE_RAID, 
    107113    CONFIG_BATTLEGROUND_CAST_DESERTER, 
     114    CONFIG_BATTLEGROUND_QUEUE_ANNOUNCER_ENABLE, 
     115    CONFIG_BATTLEGROUND_QUEUE_ANNOUNCER_PLAYERONLY, 
    108116    CONFIG_INSTANCE_RESET_TIME_HOUR, 
    109117    CONFIG_INSTANCE_UNLOAD_DELAY, 
     
    144152    CONFIG_QUEST_LOW_LEVEL_HIDE_DIFF, 
    145153    CONFIG_QUEST_HIGH_LEVEL_HIDE_DIFF, 
     154    CONFIG_DETECT_POS_COLLISION, 
    146155    CONFIG_RESTRICTED_LFG_CHANNEL, 
    147156    CONFIG_SILENTLY_GM_JOIN_TO_CHANNEL, 
     
    317326struct CliCommandHolder 
    318327{ 
    319         typedef void Print(const char*); 
    320  
    321         char *m_command; 
    322         Print* m_print; 
    323  
    324         CliCommandHolder(const char *command, Print* zprint) 
    325                 : m_print(zprint) 
    326         { 
    327                 size_t len = strlen(command)+1; 
    328                 m_command = new char[len]; 
    329                 memcpy(m_command, command, len); 
    330         } 
    331  
    332         ~CliCommandHolder() { delete[] m_command; } 
     328    typedef void Print(const char*); 
     329 
     330    char *m_command; 
     331    Print* m_print; 
     332 
     333    CliCommandHolder(const char *command, Print* zprint) 
     334        : m_print(zprint) 
     335    { 
     336        size_t len = strlen(command)+1; 
     337        m_command = new char[len]; 
     338        memcpy(m_command, command, len); 
     339    } 
     340 
     341    ~CliCommandHolder() { delete[] m_command; } 
    333342}; 
    334343 
     
    337346{ 
    338347    public: 
    339         static volatile bool m_stopEvent; 
    340348        static volatile uint32 m_worldLoopCounter; 
    341349 
     
    345353        WorldSession* FindSession(uint32 id) const; 
    346354        void AddSession(WorldSession *s); 
    347  
    348355        bool RemoveSession(uint32 id); 
    349356        /// Get the number of current active sessions 
     
    408415        void LoadConfigSettings(bool reload = false); 
    409416 
    410         void SendWorldText(int32 string_id, ...);  
     417        void SendWorldText(int32 string_id, ...); 
    411418        void SendGlobalMessage(WorldPacket *packet, WorldSession *self = 0, uint32 team = 0); 
    412419        void SendZoneMessage(uint32 zone, WorldPacket *packet, WorldSession *self = 0, uint32 team = 0); 
     
    415422 
    416423        /// Are we in the middle of a shutdown? 
    417         uint32 GetShutdownMask() const { return m_ShutdownMask; } 
    418424        bool IsShutdowning() const { return m_ShutdownTimer > 0; } 
    419         void ShutdownServ(uint32 time, uint32 options = 0); 
     425        void ShutdownServ(uint32 time, uint32 options, uint8 exitcode); 
    420426        void ShutdownCancel(); 
    421427        void ShutdownMsg(bool show = false, Player* player = NULL); 
     428        static uint8 GetExitCode() { return m_ExitCode; } 
     429        static void StopNow(uint8 exitcode) { m_stopEvent = true; m_ExitCode = exitcode; } 
     430        static bool IsStopped() { return m_stopEvent; } 
    422431 
    423432        void Update(time_t diff); 
     
    454463        void KickAllQueued(); 
    455464        BanReturn BanAccount(BanMode mode, std::string nameOrIP, std::string duration, std::string reason, std::string author); 
    456                 bool RemoveBanAccount(BanMode mode, std::string nameOrIP); 
     465        bool RemoveBanAccount(BanMode mode, std::string nameOrIP); 
    457466 
    458467        void ScriptsStart(std::map<uint32, std::multimap<uint32, ScriptInfo> > const& scripts, uint32 id, Object* source, Object* target); 
     
    482491        LocaleConstant GetAvailableDbcLocale(LocaleConstant locale) const { if(m_availableDbcLocaleMask & (1 << locale)) return locale; else return m_defaultDbcLocale; } 
    483492 
    484                 //used World DB version 
    485                 void LoadDBVersion(); 
    486                 char const* GetDBVersion() { return m_DBVersion.c_str(); } 
    487  
    488                 //used Script version 
    489                 void SetScriptsVersion(char const* version) { m_ScriptsVersion = version ? version : "unknown scripting library"; } 
    490                 char const* GetScriptsVersion() { return m_ScriptsVersion.c_str(); } 
     493        //used World DB version 
     494        void LoadDBVersion(); 
     495        char const* GetDBVersion() { return m_DBVersion.c_str(); } 
     496 
     497        //used Script version 
     498        void SetScriptsVersion(char const* version) { m_ScriptsVersion = version ? version : "unknown scripting library"; } 
     499        char const* GetScriptsVersion() { return m_ScriptsVersion.c_str(); } 
    491500 
    492501    protected: 
     
    499508        void ResetDailyQuests(); 
    500509    private: 
     510        static volatile bool m_stopEvent; 
     511        static uint8 m_ExitCode; 
     512        uint32 m_ShutdownTimer; 
     513        uint32 m_ShutdownMask; 
     514 
    501515        time_t m_startTime; 
    502516        time_t m_gameTime; 
     
    526540        std::set<uint32> m_forbiddenMapIds; 
    527541 
    528         uint32 m_ShutdownTimer; 
    529         uint32 m_ShutdownMask; 
    530  
    531542        // for max speed access 
    532543        static float m_MaxVisibleDistanceForCreature; 
     
    546557        //Player Queue 
    547558        Queue m_QueuedPlayer; 
    548          
     559 
    549560        //sessions that are added async 
    550561        void AddSession_(WorldSession* s); 
    551562        ZThread::LockedQueue<WorldSession*, ZThread::FastMutex> addSessQueue; 
    552563 
    553                 //used versions 
    554                 std::string m_DBVersion; 
    555                 std::string m_ScriptsVersion; 
     564        //used versions 
     565        std::string m_DBVersion; 
     566        std::string m_ScriptsVersion; 
    556567}; 
    557568