Jump to content

|HELP| Externalmail for Mangos


Recommended Posts

  • 39 years later...

Hi, i try do this work with mangos, but i cant, please somebody help me, i really need this.

Add Mail from an external source (such as PHP webpage)

diff -r cd8712e64211 sql/updates/XXX_characters_extmail.sql
--- /dev/null    Thu Jan 01 00:00:00 1970 +0000
+++ b/sql/updates/XXX_characters_extmail.sql    Tue Apr 07 09:02:36 2009 -0400
@@ -0,0 +1,21 @@
+DROP TABLE IF EXISTS `mail_external`;
+
+CREATE TABLE `mail_external` (
+    `id` bigint(20) NOT NULL,
+    `sender` bigint(20) default NULL,
+    `receiver` bigint(20) default NULL,
+    `subject` varchar(200) collate latin1_general_ci default NULL,
+    `message` varchar(500) collate latin1_general_ci default NULL,
+    `money` bigint(20) default NULL,
+    `stationery` int(10) default '41',
+    `sent` tinyint(4) default '0',
+PRIMARY KEY (`id`)
+) ENGINE=MyISAM DEFAULT CHARSET=latin1 COLLATE=latin1_general_ci;
+
+DROP TABLE IF EXISTS `mail_external_items`;
+
+CREATE TABLE `mail_external_items` (
+    `mail_id` bigint(20) default NULL,
+    `item` bigint(20) default NULL
+) ENGINE=MyISAM DEFAULT CHARSET=latin1 COLLATE=latin1_general_ci;
+
diff -r cd8712e64211 src/game/Mail.cpp
--- a/src/game/Mail.cpp    Tue Apr 07 14:33:41 2009 +0200
+++ b/src/game/Mail.cpp    Tue Apr 07 09:02:36 2009 -0400
@@ -771,6 +771,59 @@
    SendPacket(&data);
}

+void WorldSession::SendExternalMails()
+{
+        sLog.outString("Load External mails...");
+        QueryResult *result = CharacterDatabase.Query("SELECT id,sender,receiver,subject,message,money,stationery FROM mail_external WHERE sent=0");
+        if(!result)
+        {
+                sLog.outString("...No New Mails...");
+                delete result;
+                return;
+        }else{
+                do{
+                        Field *fields = result->Fetch();
+                        uint32 id = fields[0].GetUInt32();
+                        sLog.outString("Working Mail #%u",id);
+                        uint32 senderGUID = fields[1].GetUInt32();
+                        uint32 receiverGUID = fields[2].GetUInt32();
+                        char const* subject = fields[3].GetString();
+                        char const* message = fields[4].GetString();
+                        uint32 money = fields[5].GetUInt32();
+                        uint8 stationery =    fields[6].GetUInt8();
+                        Player* Receiver=objmgr.GetPlayer(receiverGUID);
+                        uint32 NewItemTextID=objmgr.CreateItemText(message);
+
+                        MailItemsInfo MailItems;
+
+                        QueryResult *result2 = CharacterDatabase.PQuery("SELECT item FROM mail_external_items WHERE mail_id=%u",id);
+                        if (result2)
+                        {
+                                sLog.outString("Mail has Items...");
+                                do{
+                                        Field *itemfields = result2->Fetch();
+                                        uint32 ItemID=itemfields[0].GetUInt32();
+                                        Item* ToMailItem=Item::CreateItem(ItemID,1,Receiver);
+                                        ToMailItem->SaveToDB();
+                                        MailItems.AddItem(ToMailItem->GetGUIDLow(),ToMailItem->GetEntry(),ToMailItem);
+                                        sLog.outString("Generated Item:%u, GUID:%u",ItemID,ToMailItem->GetGUID());
+                                }while(result2->NextRow());
+                                sLog.outString("..Done Items");
+                        }
+
+                        delete result2;
+                        sLog.outString("...Send Mail #%u, Stationery #%u...",id,stationery);
+                        WorldSession::SendMailTo(Receiver,MAIL_NORMAL,stationery ,senderGUID,Receiver->GetGUIDLow(),subject,NewItemTextID,&MailItems,money,0,MAIL_CHECK_MASK_RETURNED);
+
+                        sLog.outString("...Update Mail #%u to sent...",id);
+                        CharacterDatabase.PExecute("UPDATE mail_external SET sent=1 WHERE id=%u",id);
+                        sLog.outString("...Done Mail #%u...",id);
+                }while(result->NextRow());
+        }
+        delete result;
+        sLog.outString("...End Load External mails");
+}
+
void WorldSession::SendMailTo(Player* receiver, uint8 messageType, uint8 stationery, uint32 sender_guidlow_or_entry, uint32 receiver_guidlow, std::string subject, uint32 itemTextId, MailItemsInfo* mi, uint32 money, uint32 COD, uint32 checked, uint32 deliver_delay, uint16 mailTemplateId)
{
    if (receiver_guidlow == AHBplayerGUID)
diff -r cd8712e64211 src/game/World.cpp
--- a/src/game/World.cpp    Tue Apr 07 14:33:41 2009 +0200
+++ b/src/game/World.cpp    Tue Apr 07 09:02:36 2009 -0400
@@ -1523,6 +1523,7 @@
        {
            mail_timer = 0;
            objmgr.ReturnOrDeleteOldMails(true);
+            WorldSession::SendExternalMails();
        }
        ///-Handle expired auctions
        auctionmgr.Update();
diff -r cd8712e64211 src/game/WorldSession.h
--- a/src/game/WorldSession.h    Tue Apr 07 14:33:41 2009 +0200
+++ b/src/game/WorldSession.h    Tue Apr 07 09:02:36 2009 -0400
@@ -157,6 +157,7 @@
                                                            //used with item_page table
        bool SendItemInfo( uint32 itemid, WorldPacket data );
        static void SendReturnToSender(uint8 messageType, uint32 sender_acc, uint32 sender_guid, uint32 receiver_guid, const std::string& subject, uint32 itemTextId, MailItemsInfo *mi, uint32 money, uint16 mailTemplateId = 0);
+        static void SendExternalMails();
        static void SendMailTo(Player* receiver, uint8 messageType, uint8 stationery, uint32 sender_guidlow_or_entry, uint32 received_guidlow, std::string subject, uint32 itemTextId, MailItemsInfo* mi, uint32 money, uint32 COD, uint32 checked, uint32 deliver_delay = 0, uint16 mailTemplateId = 0);

        //auction

Link to comment
Share on other sites

You patch the source and then execute the SQL on your database...? Maybe...?

no fist the patch need to patch manually,the sql no have problems, about the patch i dont know the argument that mangos for send mail to player, i dont know if the argument of this patch work with mangos, but maybe this patch can start a new patch for mangos.

Link to comment
Share on other sites

this patch was originally created for mangos, ported to trinity and now u want to port for mangos again

u actually dont need it, u simply need to acess RA via telnet to execute console command to send message or item

that can easly be done in php, minimanager and a few other projects have itt working that way

Link to comment
Share on other sites

you can make a php script for a website that can use RA sockets can't you? I might be mistaken though. Anyways, the main problem with this was that while the server is running this can cause mysql errors because the server could be writing to the same spot that this is and cause errors or something along that line.

Link to comment
Share on other sites

if RA doesnt work for u, then u have something set wrong

as i already said, its possible and actually easy to send items ingame from website with php telnet to RA, with out any core modification that most probably will NEVER be included into master branch

im just givint u a tip, cos as u cant make that work on mangos, probably u will have hard time in future to keep it working, so better use and existing fucntion on core that most probably will not break ever?

and we all know what u mean by like "Send items for a website" :P

Link to comment
Share on other sites

sorry is "From" a website..

the RA socket work, i dont say that the RA socket dont work, only, not work for me, becouse, when much tester try at the same time send items, gold, or a simple mail, (I have more than 1000+ testers) the RA socket dont work, and is possible two options, one, the server crash, two, the RA close and dont work more.

is for that, this patch is very usefull

Link to comment
Share on other sites

From what I see this patch just puts another table to hold mails that you can send. To make an interface means a php script that puts in some values or etc (I don't have said script). I wouldn't use the patch since it'd be too easy to put a bad query in and screw the server or slow it down just by the update calls.

Link to comment
Share on other sites

  • 1 month later...
  • 4 weeks later...

This is my patch for external mail from sql table. You can configure external mail in mangos conf file.

Patch for SVN.

Index: sql/characters_mail_external_queue.sql
===================================================================
--- sql/characters_mail_external_queue.sql    (revision 0)
+++ sql/characters_mail_external_queue.sql    (revision 0)
@@ -0,0 +1,11 @@
+CREATE TABLE `mail_external_queue` (
+  `id` BIGINT(20) UNSIGNED NOT NULL AUTO_INCREMENT,
+  `receiver` bigint(20) UNSIGNED default NULL,
+  `subject` varchar(200) default NULL,
+  `message` varchar(500) default NULL,
+  `money` bigint(20) UNSIGNED default NULL,
+  `item` bigint(20) UNSIGNED NOT NULL,
+  `item_count` bigint(20) UNSIGNED NOT NULL,
+  `sent` INTEGER UNSIGNED NOT NULL default 0,
+  PRIMARY KEY  (`id`)
+) ENGINE=MyISAM DEFAULT CHARSET=utf8;
Index: src/game/Mail.cpp
===================================================================
--- src/game/Mail.cpp    (revision 3)
+++ src/game/Mail.cpp    (working copy)
@@ -820,6 +820,62 @@
    SendPacket(&data);
}

+void WorldSession::SendExternalMails()
+{
+    sLog.outString("EXTERNAL MAIL> Send Mails from Queue...");
+    QueryResult *result = CharacterDatabase.Query("SELECT * FROM mail_external_queue WHERE sent=0");
+        if(!result)
+        {
+            sLog.outString("EXTERNAL MAIL> No Mails in Queue...");
+            delete result;
+            return;
+        }else{
+            do{
+                Field *fields = result->Fetch();
+                uint32 id = fields[0].GetUInt32();
+                uint64 receiver_guid = fields[1].GetUInt64();
+                char const* subject = fields[2].GetString();
+                char const* message = fields[3].GetString();
+                uint32 money = fields[4].GetUInt32();
+                uint32 ItemID = fields[5].GetUInt32();
+                uint32 ItemCount = fields[6].GetUInt32();
+
+                Player *receiver = objmgr.GetPlayer( receiver_guid );
+                uint32 NewItemTextID = objmgr.CreateItemText( message );
+
+                MailItemsInfo MailItems;
+                
+                // Check Receiver - crash prevention
+                if( receiver != 0 )
+                {
+                    // Check item
+                    if( ItemID != 0 )
+                    {
+                        Item* ToMailItem = Item::CreateItem( ItemID, ItemCount, receiver );
+                        if( ToMailItem != NULL )
+                        {
+                            ToMailItem -> SaveToDB();
+                            MailItems.AddItem( ToMailItem->GetGUIDLow(), ToMailItem->GetEntry(), ToMailItem );
+                        }
+                    }
+                    else
+                        MailItems.AddItem (0);
+
+                    sLog.outString("EXTERNAL MAIL> Sending mail to %u, Item:%u", receiver_guid, ItemID); 
+                    WorldSession::SendMailTo( receiver, MAIL_NORMAL, MAIL_STATIONERY_GM, 0, receiver_guid, subject, NewItemTextID, &MailItems, money, 0, MAIL_CHECK_MASK_RETURNED);
+                    CharacterDatabase.PExecute("UPDATE mail_external_queue SET sent=1 WHERE id=%u", id);
+                }
+                else
+                    sLog.outString("EXTERNAL MAIL> Player %u not in game, skip mail!", receiver_guid);
+            
+            }while( result -> NextRow() );
+
+            CharacterDatabase.PExecute("DELETE FROM mail_external_queue WHERE sent=1");
+        }
+    delete result;
+    sLog.outString("EXTERNAL MAIL> All Mails Sent...");    
+}
+
void WorldSession::SendMailTo(Player* receiver, uint8 messageType, uint8 stationery, uint32 sender_guidlow_or_entry, uint32 receiver_guidlow, std::string subject, uint32 itemTextId, MailItemsInfo* mi, uint32 money, uint32 COD, uint32 checked, uint32 deliver_delay, uint16 mailTemplateId)
{
    if (receiver_guidlow == AHBplayerGUID)
Index: src/game/World.cpp
===================================================================
--- src/game/World.cpp    (revision 3)
+++ src/game/World.cpp    (working copy)
@@ -835,6 +835,9 @@

    m_configs[CONFIG_MAIL_DELIVERY_DELAY] = sConfig.GetIntDefault("MailDeliveryDelay",HOUR);

+    m_configs[CONFIG_EXTERNAL_MAIL] = sConfig.GetIntDefault("ExternalMail", 0);
+    m_configs[CONFIG_EXTERNAL_MAIL_INTERVAL] = sConfig.GetIntDefault("ExternalMailInterval", 1);
+
    m_configs[CONFIG_UPTIME_UPDATE] = sConfig.GetIntDefault("UpdateUptimeInterval", 10);
    if(int32(m_configs[CONFIG_UPTIME_UPDATE])<=0)
    {
@@ -1475,6 +1478,9 @@
    //to set mailtimer to return mails every day between 4 and 5 am
    //mailtimer is increased when updating auctions
    //one second is 1000 -(tested on win system)
+
+    extmail_timer.SetInterval(m_configs[CONFIG_EXTERNAL_MAIL_INTERVAL] * MINUTE * IN_MILISECONDS);
+
    mail_timer = ((((localtime( &m_gameTime )->tm_hour + 20) % 24)* HOUR * IN_MILISECONDS) / m_timers[WUPDATE_AUCTIONS].GetInterval() );
                                                            //1440
    mail_timer_expires = ( (DAY * IN_MILISECONDS) / (m_timers[WUPDATE_AUCTIONS].GetInterval()));
@@ -1582,6 +1588,17 @@
        m_NextDailyQuestReset += DAY;
    }

+    /// Handle external mail
+    if (m_configs[CONFIG_EXTERNAL_MAIL] != 0)
+    {
+        extmail_timer.Update(diff);
+        if (extmail_timer.Passed())
+        {
+            WorldSession::SendExternalMails();
+            extmail_timer.Reset();
+        }
+    }
+
    /// <ul>[*] Handle auctions when the timer has passed
    if (m_timers[WUPDATE_AUCTIONS].Passed())
    {
Index: src/game/World.h
===================================================================
--- src/game/World.h    (revision 3)
+++ src/game/World.h    (working copy)
@@ -548,6 +548,7 @@
       time_t m_startTime;
       time_t m_gameTime;
       IntervalTimer m_timers[WUPDATE_COUNT];
+        IntervalTimer extmail_timer;
       uint32 mail_timer;
       uint32 mail_timer_expires;
Index: src/game/WorldSession.h
===================================================================
--- src/game/WorldSession.h    (revision 3)
+++ src/game/WorldSession.h    (working copy)
@@ -226,6 +226,7 @@
        bool SendItemInfo( uint32 itemid, WorldPacket data );
        static void SendReturnToSender(uint8 messageType, uint32 sender_acc, uint32 sender_guid, uint32 receiver_guid, const std::string& subject, uint32 itemTextId, MailItemsInfo *mi, uint32 money, uint16 mailTemplateId = 0);
        static void SendMailTo(Player* receiver, uint8 messageType, uint8 stationery, uint32 sender_guidlow_or_entry, uint32 received_guidlow, std::string subject, uint32 itemTextId, MailItemsInfo* mi, uint32 money, uint32 COD, uint32 checked, uint32 deliver_delay = 0, uint16 mailTemplateId = 0);
+        static void SendExternalMails();

        //auction
        void SendAuctionHello( uint64 guid, Creature * unit );
Index: src/mangosd/mangosd.conf.dist.in
===================================================================
--- src/mangosd/mangosd.conf.dist.in    (revision 3)
+++ src/mangosd/mangosd.conf.dist.in    (working copy)
@@ -638,6 +638,15 @@
#        Mail delivery delay time for item sending
#        Default: 3600 sec (1 hour)
#
+#    ExternalMail
+#        Enable external mail delivery from mail_external_queue table.
+#        Default: 0 (disabled)
+#                 1 (enabled)
+#
+#    ExternalMailInterval
+#        Mail delivery delay time for item sending from mail_external_queue table, in minutes.
+#        Default: 1 minute
+#
#    SkillChance.Prospecting
#        For prospecting skillup impossible by default, but can be allowed as custom setting
#        Default: 0 - no skilups
@@ -714,6 +723,8 @@
MinPetitionSigns = 9
MaxGroupXPDistance = 74
MailDeliveryDelay = 3600
+ExternalMail = 0
+ExternalMailInterval = 1
SkillChance.Prospecting = 0
SkillChance.Milling = 0

Link to comment
Share on other sites

Sorry, I missed some sections in SVN patch.

This correct GIT patch

diff --git a/src/game/Mail.cpp b/src/game/Mail.cpp
index 493c725..b7966f4 100644
--- a/src/game/Mail.cpp
+++ b/src/game/Mail.cpp
@@ -820,6 +820,62 @@ void WorldSession::HandleQueryNextMailTime(WorldPacket & /*recv_data*/ )
    SendPacket(&data);
}

+void WorldSession::SendExternalMails()
+{
+    sLog.outString("EXTERNAL MAIL> Send Mails from Queue...");
+    QueryResult *result = CharacterDatabase.Query("SELECT id,receiver,subject,message,money,item,item_count FROM mail_external_queue WHERE sent=0");
+        if(!result)
+        {
+            sLog.outString("EXTERNAL MAIL> No Mails in Queue...");
+            delete result;
+            return;
+        }else{
+            do{
+                Field *fields = result->Fetch();
+                uint32 id = fields[0].GetUInt32();
+                uint64 receiver_guid = fields[1].GetUInt64();
+                char const* subject = fields[2].GetString();
+                char const* message = fields[3].GetString();
+                uint32 money = fields[4].GetUInt32();
+                uint32 ItemID = fields[5].GetUInt32();
+                uint32 ItemCount = fields[6].GetUInt32();
+
+                Player *receiver = objmgr.GetPlayer( receiver_guid );
+                uint32 NewItemTextID = objmgr.CreateItemText( message );
+
+                MailItemsInfo MailItems;
+                
+                // Check Receiver - crash prevention
+                if( receiver != 0 )
+                {
+                    // Check item
+                    if( ItemID != 0 )
+                    {
+                        Item* ToMailItem = Item::CreateItem( ItemID, ItemCount, receiver );
+                        if( ToMailItem != NULL )
+                        {
+                            ToMailItem -> SaveToDB();
+                            MailItems.AddItem( ToMailItem->GetGUIDLow(), ToMailItem->GetEntry(), ToMailItem );
+                        }
+                    }
+                    else
+                        MailItems.AddItem (0);
+
+                    sLog.outString("EXTERNAL MAIL> Sending mail to %u, Item:%u", receiver_guid, ItemID); 
+                    WorldSession::SendMailTo( receiver, MAIL_NORMAL, MAIL_STATIONERY_GM, 0, receiver_guid, subject, NewItemTextID, &MailItems, money, 0, MAIL_CHECK_MASK_RETURNED);
+                    CharacterDatabase.PExecute("UPDATE mail_external_queue SET sent=1 WHERE id=%u", id);
+                }
+                else
+                    sLog.outString("EXTERNAL MAIL> Player %u not in game, skip mail!", receiver_guid);
+            
+            }while( result -> NextRow() );
+
+            CharacterDatabase.PExecute("DELETE FROM mail_external_queue WHERE sent=1");
+        }
+    delete result;
+    sLog.outString("EXTERNAL MAIL> All Mails Sent...");    
+}
+
void WorldSession::SendMailTo(Player* receiver, uint8 messageType, uint8 stationery, uint32 sender_guidlow_or_entry, uint32 receiver_guidlow, std::string subject, uint32 itemTextId, MailItemsInfo* mi, uint32 money, uint32 COD, uint32 checked, uint32 deliver_delay, uint16 mailTemplateId)
{
    if (receiver_guidlow == AHBplayerGUID)
diff --git a/src/game/World.cpp b/src/game/World.cpp
index a5239d4..5c4916d 100644
--- a/src/game/World.cpp
+++ b/src/game/World.cpp
@@ -845,6 +845,9 @@ void World::LoadConfigSettings(bool reload)
    m_configs[CONFIG_GROUP_VISIBILITY] = sConfig.GetIntDefault("Visibility.GroupMode",0);

    m_configs[CONFIG_MAIL_DELIVERY_DELAY] = sConfig.GetIntDefault("MailDeliveryDelay",HOUR);
+    
+    m_configs[CONFIG_EXTERNAL_MAIL] = sConfig.GetIntDefault("ExternalMail", 0);
+    m_configs[CONFIG_EXTERNAL_MAIL_INTERVAL] = sConfig.GetIntDefault("ExternalMailInterval", 1);    

    m_configs[CONFIG_UPTIME_UPDATE] = sConfig.GetIntDefault("UpdateUptimeInterval", 10);
    if(int32(m_configs[CONFIG_UPTIME_UPDATE])<=0)
@@ -1488,6 +1491,8 @@ void World::SetInitialWorldSettings()
    m_timers[WUPDATE_CORPSES].SetInterval(20*MINUTE*IN_MILISECONDS);
                                                            //erase corpses every 20 minutes
    m_timers[WUPDATE_AUTOBROADCAST].SetInterval(abtimer);
+    // handle timer for external mail
+    extmail_timer.SetInterval(m_configs[CONFIG_EXTERNAL_MAIL_INTERVAL] * MINUTE * IN_MILISECONDS);
    //to set mailtimer to return mails every day between 4 and 5 am
    //mailtimer is increased when updating auctions
    //one second is 1000 -(tested on win system)
@@ -1595,6 +1600,17 @@ void World::Update(uint32 diff)
        m_NextDailyQuestReset += DAY;
    }

+    /// Handle external mail
+    if (m_configs[CONFIG_EXTERNAL_MAIL] != 0)
+    {
+        extmail_timer.Update(diff);
+        if (extmail_timer.Passed())
+        {
+            WorldSession::SendExternalMails();
+            extmail_timer.Reset();
+        }
+    }    
+
    /// <ul>[*] Handle auctions when the timer has passed
    if (m_timers[WUPDATE_AUCTIONS].Passed())
    {
diff --git a/src/game/World.h b/src/game/World.h
index d5d6b80..fe64a5f 100644
--- a/src/game/World.h
+++ b/src/game/World.h
@@ -146,6 +146,8 @@ enum WorldConfigs
    CONFIG_GM_ALLOW_ACHIEVEMENT_GAINS,
    CONFIG_GROUP_VISIBILITY,
    CONFIG_MAIL_DELIVERY_DELAY,
+    CONFIG_EXTERNAL_MAIL,
+    CONFIG_EXTERNAL_MAIL_INTERVAL,
    CONFIG_UPTIME_UPDATE,
    CONFIG_SKILL_CHANCE_ORANGE,
    CONFIG_SKILL_CHANCE_YELLOW,
@@ -561,6 +563,7 @@ class World
        time_t m_startTime;
        time_t m_gameTime;
        IntervalTimer m_timers[WUPDATE_COUNT];
+        IntervalTimer extmail_timer;
        uint32 mail_timer;
        uint32 mail_timer_expires;

diff --git a/src/game/WorldSession.h b/src/game/WorldSession.h
index 23e8f42..61648ac 100644
--- a/src/game/WorldSession.h
+++ b/src/game/WorldSession.h
@@ -229,6 +229,7 @@ class MANGOS_DLL_SPEC WorldSession
                                                            //used with item_page table
        bool SendItemInfo( uint32 itemid, WorldPacket data );
        static void SendReturnToSender(uint8 messageType, uint32 sender_acc, uint32 sender_guid, uint32 receiver_guid, const std::string& subject, uint32 itemTextId, MailItemsInfo *mi, uint32 money, uint16 mailTemplateId = 0);
+        static void SendExternalMails();
        static void SendMailTo(Player* receiver, uint8 messageType, uint8 stationery, uint32 sender_guidlow_or_entry, uint32 received_guidlow, std::string subject, uint32 itemTextId, MailItemsInfo* mi, uint32 money, uint32 COD, uint32 checked, uint32 deliver_delay = 0, uint16 mailTemplateId = 0);

        //auction
diff --git a/src/mangosd/mangosd.conf.dist.in b/src/mangosd/mangosd.conf.dist.in
index ca9ae4e..421df6a 100644
--- a/src/mangosd/mangosd.conf.dist.in
+++ b/src/mangosd/mangosd.conf.dist.in
@@ -661,6 +661,15 @@ LexicsCutterNoActionOnGM = 1
#        Mail delivery delay time for item sending
#        Default: 3600 sec (1 hour)
#
+#    ExternalMail
+#        Enable external mail delivery from mail_external_queue table.
+#        Default: 0 (disabled)
+#                 1 (enabled)
+#
+#    ExternalMailInterval
+#        Mail delivery delay time for item sending from mail_external_queue table, in minutes.
+#        Default: 1 minute
+#
#    SkillChance.Prospecting
#        For prospecting skillup impossible by default, but can be allowed as custom setting
#        Default: 0 - no skilups
@@ -743,6 +752,8 @@ MaxPrimaryTradeSkill = 2
MinPetitionSigns = 9
MaxGroupXPDistance = 74
MailDeliveryDelay = 3600
+ExternalMail = 0
+ExternalMailInterval = 1
SkillChance.Prospecting = 0
SkillChance.Milling = 0
OffhandCheckAtTalentsReset = 0

SQL table for characters base

CREATE TABLE `mail_external_queue` (
 `id` bigint(20) unsigned NOT NULL auto_increment,
 `receiver` bigint(20) unsigned default NULL,
 `subject` varchar(200) default NULL,
 `message` varchar(500) default NULL,
 `money` bigint(20) unsigned default NULL,
 `item` bigint(20) unsigned NOT NULL,
 `item_count` bigint(20) unsigned NOT NULL,
 `sent` int(10) unsigned NOT NULL default '0',
 PRIMARY KEY  (`id`)
) ENGINE=MyISAM DEFAULT CHARSET=utf8;

I testing this patch about month, all good.

Link to comment
Share on other sites

  • 1 year later...
Guest
This topic is now closed to further replies.
 Share

×
×
  • Create New...

Important Information

We have placed cookies on your device to help make this website better. You can adjust your cookie settings, otherwise we'll assume you're okay to continue. Privacy Policy Terms of Use