Party invites crash the game server

Post Reply
Drkepper
Posts: 3
Joined: Fri Jan 03, 2014 8:38 pm

Party invites crash the game server

Post by Drkepper » Fri Sep 25, 2015 6:09 pm

Well as the title says, everytime someone invites another player to a party the game server crashes and I'm really not sure why. I'm running the server on my local intranet.

This is the error code:
Unhandled exception at 0x00F213FA in DSGame-server.exe: 0xC0000005: Access violation reading location 0x00000000.

If there is a handler for this exception, the program may be safely continued.
The exception packet_system.cpp here's the code for reference, it's stopping at the following statement:

ShowDebug(CL_CYAN"Building invite packet to send to lobby server for %s\n" CL_RESET, zoneutils::GetCharFromWorld(charid, targid)->GetName());

Code: Select all

void SmallPacket0x06E(map_session_data_t* session, CCharEntity* PChar, CBasicPacket data)
{
    uint32 charid = RBUFL(data, 0x04);
    uint16 targid = RBUFW(data, 0x08);
    // cannot invite yourself
    if (PChar->id == charid)
        return;

    if (jailutils::InPrison(PChar))
    {
        // Initiator is in prison.  Send error message.
        PChar->pushPacket(new CMessageBasicPacket(PChar, PChar, 0, 0, 316));
        return;
    }

    switch (RBUFB(data, (0x0A)))
    {
    case 0: // party - must by party leader or solo
        if (PChar->PParty == nullptr || PChar->PParty->GetLeader() == PChar)
        {
            if (PChar->PParty && PChar->PParty->members.size() > 5)
            {
                PChar->pushPacket(new CMessageStandardPacket(PChar, 0, 0, 23));
                break;
            }
            CCharEntity* PInvitee = nullptr;
            if (targid != 0)
            {
                PInvitee = zoneutils::GetCharFromWorld(charid, targid);
            }
            if (PInvitee)
            {
				ShowDebug(CL_CYAN"%s sent party invite to %s\n" CL_RESET, PChar->GetName(), PInvitee->GetName());
                //make sure invitee isn't dead or in jail, they aren't a party member and don't already have an invite pending, and your party is not full
                if (PInvitee->isDead() || jailutils::InPrison(PInvitee) || PInvitee->InvitePending.id != 0 || PInvitee->PParty != nullptr)
                {
					ShowDebug(CL_CYAN"%s is dead, in prision, has a pending invite, or is already in a party\n" CL_RESET, PInvitee->GetName());
                    PChar->pushPacket(new CMessageStandardPacket(PChar, 0, 0, 23));
                    break;
                }
                if (PInvitee->StatusEffectContainer->HasStatusEffect(EFFECT_LEVEL_SYNC))
                {
					ShowDebug(CL_CYAN"%s has level sync, unable to send invite\n" CL_RESET, PInvitee->GetName());
                    PChar->pushPacket(new CMessageStandardPacket(PChar, 0, 0, 236));
                    break;
                }

                PInvitee->InvitePending.id = PChar->id;
                PInvitee->InvitePending.targid = PChar->targid;
                PInvitee->pushPacket(new CPartyInvitePacket(charid, targid, PChar, INVITE_PARTY));
				ShowDebug(CL_CYAN"Sent party invite packet to %s\n" CL_RESET, PInvitee->GetName());
                if (PChar->PParty && PChar->PParty->GetSyncTarget())
                    PInvitee->pushPacket(new CMessageStandardPacket(PInvitee, 0, 0, 235));
            }
            else
            {
				ShowDebug(CL_CYAN"Building invite packet to send to lobby server for %s\n" CL_RESET, zoneutils::GetCharFromWorld(charid, targid)->GetName());
                //on another server (hopefully)
                uint8 packetData[12];
                WBUFL(packetData, 0) = charid;
                WBUFW(packetData, 4) = targid;
                WBUFL(packetData, 6) = PChar->id;
                WBUFW(packetData, 10) = PChar->targid;
                message::send(MSG_PT_INVITE, packetData, sizeof packetData, new CPartyInvitePacket(charid, targid, PChar, INVITE_PARTY));
				ShowDebug(CL_CYAN"Sent invite packet to lobby server for %s\n" CL_RESET, zoneutils::GetCharFromWorld(charid, targid)->GetName());
            }
        }
		else //in party but not leader, cannot invite
		{
			ShowDebug(CL_CYAN"%s is not party leader, cannot send invite\n" CL_RESET, PChar->GetName());
			PChar->pushPacket(new CMessageStandardPacket(PChar, 0, 0, 21));
		}
        break;

    case 5: // alliance - must be unallied party leader or alliance leader of a non-full alliance
        if (PChar->PParty && PChar->PParty->GetLeader() == PChar &&
            (PChar->PParty->m_PAlliance == nullptr ||
            (PChar->PParty->m_PAlliance->getMainParty() == PChar->PParty && PChar->PParty->m_PAlliance->partyCount() < 3)))
        {
            CCharEntity* PInvitee = nullptr;
            if (targid != 0)
            {
                PInvitee = zoneutils::GetCharFromWorld(charid, targid);
            }
            if (PInvitee)
            {
				ShowDebug(CL_CYAN"%s sent party invite to %s\n" CL_RESET, PChar->GetName(), PInvitee->GetName());
                //make sure intvitee isn't dead or in jail, they are an unallied party leader and don't already have an invite pending
                if (PInvitee->isDead() || jailutils::InPrison(PInvitee) || PInvitee->InvitePending.id != 0 ||
                    PInvitee->PParty == nullptr || PInvitee->PParty->GetLeader() != PInvitee || PInvitee->PParty->m_PAlliance)
                {
					ShowDebug(CL_CYAN"%s is dead, in prision, has a pending invite, or is already in a party/alliance\n" CL_RESET, PInvitee->GetName());
                    PChar->pushPacket(new CMessageStandardPacket(PChar, 0, 0, 23));
                    break;
                }
                if (PInvitee->StatusEffectContainer->HasStatusEffect(EFFECT_LEVEL_SYNC))
                {
					ShowDebug(CL_CYAN"%s has level sync, unable to send invite\n" CL_RESET, PInvitee->GetName());
                    PChar->pushPacket(new CMessageStandardPacket(PChar, 0, 0, 236));
                    break;
                }

                PInvitee->InvitePending.id = PChar->id;
                PInvitee->InvitePending.targid = PChar->targid;
                PInvitee->pushPacket(new CPartyInvitePacket(charid, targid, PChar, INVITE_ALLIANCE));
				ShowDebug(CL_CYAN"Sent party invite packet to %s\n" CL_RESET, PInvitee->GetName());
            }
            else
            {
				ShowDebug(CL_CYAN"(Alliance)Building invite packet to send to lobby server for %s\n" CL_RESET, zoneutils::GetCharFromWorld(charid, targid)->GetName());
                //on another server (hopefully)
                uint8 packetData[12];
                WBUFL(packetData, 0) = charid;
                WBUFW(packetData, 4) = targid;
                WBUFL(packetData, 6) = PChar->id;
                WBUFW(packetData, 10) = PChar->targid;
                message::send(MSG_PT_INVITE, packetData, sizeof packetData, new CPartyInvitePacket(charid, targid, PChar, INVITE_ALLIANCE));
				ShowDebug(CL_CYAN"(Alliance)Sent invite packet to lobby server for %s\n" CL_RESET, zoneutils::GetCharFromWorld(charid, targid)->GetName());
            }
        }
        break;

    default:
        ShowError(CL_RED"SmallPacket0x06E : unknown byte <%.2X>\n" CL_RESET, RBUFB(data, (0x0A)));
        break;
    }
    return;
}
My zone_settings table has the ip set to 192.168.1.3 (local computer ip for my servers computer) and port set to 54230 for all zones in the SQL database.

Here are my config files just in case that could be messing something up =x

Login_darkstar.conf:

Code: Select all

#Darkstar login server conf

#--------------------------------
#login server parametres
#--------------------------------

#Time-stamp format which will be printed before all messages.
#Can at most be 20 characters long.
#Common formats:
# %I:%M:%S %p (hour:minute:second 12 hour, AM/PM format)
# %H:%M:%S (hour:minute:second, 24 hour format)
# %d/%b/%Y (day/Month/year)
#For full format information, consult the strftime() manual.
timestamp_format: [%d/%b %H:%M]

#If redirected output contains escape sequences (color codes)
stdout_with_ansisequence: no

#Makes server output more silent by ommitting certain types of messages:
#Standard     = 1
#Status       = 2
#Info         = 4
#Notice       = 8
#Warn         = 16
#Debug        = 32
#Error        = 64
#Fatal Error  = 128
#SQL          = 256
#Lua          = 512
#Example: "console_silent: 7" Hides standard, status and information messages (1+2+4)
console_silent: 0

#--------------------------------
#SQL parameters
#--------------------------------

mysql_host:      127.0.0.1
mysql_port:      3306
mysql_login:     root
mysql_password:  MYPASSWORD --yes i have my actual password here, just not sharing it.
mysql_database:  dspdb

#Search Server Port
search_server_port: 54002

#Expansion Icons - 2 Bytes
#
#Byte 1 - Zilart to A Shantotto Ascension
#00000000 Bit0 - Not Used - Original FFXI bit
#00000010 Bit1 - Enables Rise of Zilart Icon
#00000100 Bit2 - Enables Chains of Promathia Icon
#00001000 Bit3 - Enables Treasures of Aht Urhgan Icon
#00010000 Bit4 - Enables Wings of The Goddess
#00100000 Bit5 - Enables A Crystalline Prophecy Icon
#01000000 Bit6 - Enables A Moogle Kupod'Etat Icon
#10000000 Bit7 - Enables A Shantotto Ascension Icon
#
#Byte 2 - Vision of Abyssea to Seekers of Adoulin
#00000001 Bit0 - Enables Vision of Abyssea
#00000010 Bit1 - Enables Scars of Abyssea
#00000100 Bit2 - Enables Heroes of Abyssea
#00001000 Bit3 - Enables Seekers of Adoulin
#00010000 Bit4 - Not Used - Future expansion
#00100000 Bit5 - Not Used - Future expansion
#01000000 Bit6 - Not Used - Future expansion
#10000000 Bit7 - Not Used - Future expansion

expansions: 6

#Server name (not longer than 15 characters)
servername: KeppersClinic

#Central message server settings (ensure these are the same on both all map servers and the central (lobby) server
msg_server_port: 54230
msg_server_ip: 127.0.0.1
map_darkstar.conf:

Code: Select all

#Darkstar map server conf

#--------------------------------
#map server parameters
#--------------------------------

#map server port
map_port: 54230

#Time-stamp format which will be printed before all messages.
#Can at most be 20 characters long.
#Common formats:
# %I:%M:%S %p (hour:minute:second 12 hour, AM/PM format)
# %H:%M:%S (hour:minute:second, 24 hour format)
# %d/%b/%Y (day/Month/year)
#For full format information, consult the strftime() manual.
timestamp_format: [%d/%b] [%H:%M:%S]

#If redirected output contains escape sequences (color codes)
stdout_with_ansisequence: no

#Makes server output more silent by ommitting certain types of messages:
#Standard     = 1
#Status       = 2
#Info         = 4
#Notice       = 8
#Warn         = 16
#Debug        = 32
#Error        = 64
#Fatal Error  = 128
#SQL          = 256
#Lua          = 512
#Example: "console_silent: 7" Hides standard, status and information messages (1+2+4)
console_silent: 0

#--------------------------------
#SQL parameters
#--------------------------------

mysql_host:      127.0.0.1
mysql_port:      3306
mysql_login:     root
mysql_password:  MYPASSWORD
mysql_database:  dspdb

#--------------------------------
#Packet settings
#--------------------------------

buff_maxsize: 1750
max_time_lastupdate: 60

#--------------------------------
#Game settings
#--------------------------------

#Minimal number of 0x3A packets which uses for detect lightluggage (set 0 for disable)
lightluggage_block:   4

exp_rate: 2.0
exp_loss_rate: 1.0
exp_party_gap_penalties: 1
fov_party_gap_penalties: 1
fov_allow_alliance: 1
vanadiel_time_offset: 0

#Percentage of experience normally lost to keep upon death. 0 means full loss, where 1 means no loss.
exp_retain: 1

#Minimum level at which experience points can be lost
exp_loss_level: 4

#Enable/disable Level Sync
level_sync_enable: 1

#Enable/disable jobs other than BST and RNG having widescan
all_jobs_widescan: 1

#Modifier to apply to player speed. 0 means default speed of 40, where 20 would mean speed 60 or -10 would mean speed 30.
speed_mod: 0

#Modifier to apply to agro'd monster speed. 0 means default speed of 40, where 20 would mean speed 60 or -10 would mean speed 30.
mob_speed_mod: 0

#Allows you to manipulate the constant multiplier in the skill-up rate formulas, having a potent effect on skill-up rates.
skillup_chance_multiplier: 2.5
craft_chance_multiplier: 2.6

#Multiplier for skillup amounts. Using anything above 1 will break the 0.5 cap, the cap will become 0.9 (For maximum, set to 5)
skillup_amount_multiplier: 1
craft_amount_multiplier: 1

#Crafting Factors. DO NOT change defaults without verifiable proof that your change IS how retail does it. Myths need to be optional.
craft_day_matters: 1
craft_moonphase_matters: 0
craft_direction_matters: 0

#Adjust rate of TP gain for mobs and players. Acts as a multiplier, so default is 1.
mob_tp_multiplier:    1.0
player_tp_multiplier: 1.0

#Adjust max HP pool for NMs, regular mobs, players. Acts as a multiplier, so default is 1.
nm_hp_multiplier:     1.0
mob_hp_multiplier:    1.0
player_hp_multiplier: 1.0

#Adjust max MP pool for NMs, regular mobs, and players. Acts as a multiplier, so default is 1.
nm_mp_multiplier:     1.0
mob_mp_multiplier:    1.0
player_mp_multiplier: 1.0

#Sets the fraction of MP a subjob provides to the main job. Retail is half and this acts as a divisor so default is 2
sj_mp_divisor: 2.0

#Adjust base stats (str/vit/etc.) for NMs, regular mobs, and players. Acts as a multiplier, so default is 1.
nm_stat_multiplier:     1.0
mob_stat_multiplier:    1.0
player_stat_multiplier: 1.0

#Adjust mob drop rate. Acts as a multiplier, so default is 1.
drop_rate_multiplier: 1.0

#All mobs drop this much extra gil per mob LV even if they normally drop zero.
all_mobs_gil_bonus: 0

#Maximum total bonus gil that can be dropped. Default 9999 gil.
max_gil_bonus: 9999

#Allows parry, block, and guard to skill up regardless of the action occuring.
# Bin  Dec Note
# 0000 0   Classic
# 0001 1   Parry
# 0010 2   Block
# 0100 4   Guard
# 0111 7   Parry, Block, & Guard
newstyle_skillups: 7

#Globally adjusts ALL battlefield level caps by this many levels.
Battle_cap_tweak: 0

#Enable/disable level cap of Chains of Promathia mission battlefields stored in database.
CoP_Battle_cap: 1

#Max allowed merits points players can hold
# 10 classic
# 30 abyssea
max_merit_points: 30

#Minimum time between uses of yell command (in seconds).
yell_cooldown: 1

#Audit[logging] settings
audit_chat: 0
audit_say: 0
audit_shout: 0
audit_tell: 0
audit_yell: 0
audit_linkshell: 0
audit_party: 0

#Central message server settings (ensure these are the same on both all map servers and the central (lobby) server
msg_server_port: 54230
msg_server_ip: 127.0.0.1
search_server.conf:

Code: Select all

#Darkstar search server config

#--------------------------------
#SQL parameters
#--------------------------------

mysql_host:      127.0.0.1
mysql_port:      3306
mysql_login:     root
mysql_password:  MYPASSWORD
mysql_database:  dspdb
# Enabled = 1, Disabled = 0
expire_auctions: 1
# Expire items older than this number of days 
expire_days: 3
# Interval is in seconds, default is one hour
expire_interval: 3600
Has anyone ever encountered this or have any ideas? playing ffxi without partying my make the game slightly less fun :(

User avatar
kjLotus
Special Guest
Posts: 1813
Joined: Sun Jul 22, 2012 2:16 pm

Re: Party invites crash the game server

Post by kjLotus » Fri Sep 25, 2015 6:59 pm

sounds like you haven't updated since that was fixed a few days ago

Drkepper
Posts: 3
Joined: Fri Jan 03, 2014 8:38 pm

Re: Party invites crash the game server

Post by Drkepper » Sat Sep 26, 2015 5:39 pm

AWESOME it's working now. Thanks so much!

Post Reply