EQEmulator Forums

EQEmulator Forums (https://www.eqemulator.org/forums/index.php)
-   Development::Server Code Submissions (https://www.eqemulator.org/forums/forumdisplay.php?f=669)
-   -   COMMITTED: Multiple Door Fixes (https://www.eqemulator.org/forums/showthread.php?t=35407)

Uleat 06-25-2012 05:02 AM

(Submission write-up in the previous post)

This patch was diff'd against rev. 2153 and affects the following files in ..\trunk\EQEmuServer\zone\:
doors.h
doors.cpp
perlparser.cpp
questmgr.h
questmgr.cpp



<doorsupdate.patch>
Code:

Index: doors.cpp
===================================================================
--- doors.cpp        (revision 2153)
+++ doors.cpp        (working copy)
@@ -31,6 +31,8 @@
 
 #define OPEN_DOOR 0x02
 #define CLOSE_DOOR 0x03
+#define OPEN_INVDOOR 0x03
+#define CLOSE_INVDOOR 0x02
 
 extern EntityList entity_list;
 extern WorldServer worldserver;
@@ -120,9 +122,19 @@
 {
    if(close_timer.Enabled() && close_timer.Check() && IsDoorOpen())
    {
-        triggered=false;
-        close_timer.Disable();
-        SetOpenState(false);
+                if (opentype == 40 || GetTriggerType() == 1)
+                {
+                        EQApplicationPacket* outapp = new EQApplicationPacket(OP_MoveDoor, sizeof(MoveDoor_Struct));
+                        MoveDoor_Struct* md = (MoveDoor_Struct*)outapp->pBuffer;
+                        md->doorid = door_id;
+                        md->action = invert_state == 0 ? CLOSE_DOOR : CLOSE_INVDOOR;
+                        entity_list.QueueClients(0, outapp);
+                        safe_delete(outapp);
+                }
+
+                triggered=false;
+                close_timer.Disable();
+                SetOpenState(false);
    }
        return true;
 }
@@ -200,11 +212,11 @@
                { // this door is only triggered by an object
                        if(!IsDoorOpen() || (opentype == 58))
                        {
-                                md->action = OPEN_DOOR;
+                                md->action = invert_state == 0 ? OPEN_DOOR : OPEN_INVDOOR;
                        }
                        else
                        {
-                                md->action = CLOSE_DOOR;
+                                md->action = invert_state == 0 ? CLOSE_DOOR : CLOSE_INVDOOR;
                        }
                }
                else
@@ -221,11 +233,11 @@
        {        //door not locked
                if(!IsDoorOpen() || (opentype == 58))
                {
-                        md->action = OPEN_DOOR;
+                        md->action = invert_state == 0 ? OPEN_DOOR : OPEN_INVDOOR;
                }
                else
                {
-                        md->action = CLOSE_DOOR;
+                        md->action = invert_state == 0 ? CLOSE_DOOR : CLOSE_INVDOOR;
                }
        }
        else
@@ -243,6 +255,8 @@
                                strcpy(tmpmsg, "Door is locked by an unknown guild");
                        }
                        sender->Message(4, tmpmsg);
+                        // safe_delete(outapp);
+                        // /\ possible missing line..all other 'fail' returns seem to have it
                        return;
                }
                // a key is required or the door is locked but can be picked or both
@@ -252,11 +266,11 @@
                        sender->Message_StringID(4,DOORS_GM);
                        if(!IsDoorOpen() || (opentype == 58))
                        {
-                                md->action = OPEN_DOOR;
+                                md->action = invert_state == 0 ? OPEN_DOOR : OPEN_INVDOOR;
                        }
                        else
                        {
-                                md->action = CLOSE_DOOR;
+                                md->action = invert_state == 0 ? CLOSE_DOOR : CLOSE_INVDOOR;
                        }
                }
                else if(playerkey)
@@ -270,11 +284,11 @@
                                sender->Message(4, "You got it open!");
                                if(!IsDoorOpen() || (opentype == 58))
                                {
-                                        md->action = OPEN_DOOR;
+                                        md->action = invert_state == 0 ? OPEN_DOOR : OPEN_INVDOOR;
                                }
                                else
                                {
-                                        md->action = CLOSE_DOOR;
+                                        md->action = invert_state == 0 ? CLOSE_DOOR : CLOSE_INVDOOR;
                                }
                        }
                }
@@ -295,11 +309,11 @@
                                        {
                                                if(!IsDoorOpen())
                                                {
-                                                        md->action = OPEN_DOOR;
+                                                        md->action = invert_state == 0 ? OPEN_DOOR : OPEN_INVDOOR;
                                                }
                                                else
                                                {
-                                                        md->action = CLOSE_DOOR;
+                                                        md->action = invert_state == 0 ? CLOSE_DOOR : CLOSE_INVDOOR;
                                                }
                                                sender->Message_StringID(4, DOORS_SUCCESSFUL_PICK);
                                        }
@@ -333,11 +347,11 @@
                                sender->Message(4, "You got it open!"); // more debug spam
                                if(!IsDoorOpen() || (opentype == 58))
                                {
-                                        md->action = OPEN_DOOR;
+                                        md->action = invert_state == 0 ? OPEN_DOOR : OPEN_INVDOOR;
                                }
                                else
                                {
-                                        md->action = CLOSE_DOOR;
+                                        md->action = invert_state == 0 ? CLOSE_DOOR : CLOSE_INVDOOR;
                                }
                        }
                        else
@@ -365,7 +379,7 @@
        //and met all the reqs for opening
        //everything to do with closed doors has already been taken care of
        //we return because we don't want people using teleports on an unlocked door (exploit!)
-        if(md->action == CLOSE_DOOR)
+        if((md->action == CLOSE_DOOR && invert_state == 0) || (md->action == CLOSE_INVDOOR && invert_state == 1))
        {
                safe_delete(outapp);
                return;
@@ -439,7 +453,7 @@
        }
 }
 
-void Doors::NPCOpen(NPC* sender)
+void Doors::NPCOpen(NPC* sender, bool alt_mode)
 {
        if(sender) {
                if(GetTriggerType() == 255 || GetTriggerDoorID() > 0 || GetLockpick() != 0 || GetKeyItem() != 0 || opentype == 59 || opentype == 58 || !sender->IsNPC()) { // this object isnt triggered or door is locked - NPCs should not open locked doors!
@@ -449,10 +463,37 @@
                EQApplicationPacket* outapp = new EQApplicationPacket(OP_MoveDoor, sizeof(MoveDoor_Struct));
                MoveDoor_Struct* md=(MoveDoor_Struct*)outapp->pBuffer;
                md->doorid = door_id;
-                md->action = OPEN_DOOR;
+                md->action = invert_state == 0 ? OPEN_DOOR : OPEN_INVDOOR;
                entity_list.QueueCloseClients(sender,outapp,false,200);
                safe_delete(outapp);
 
+                if(!alt_mode) { // original function
+                        if(!isopen) {
+                                close_timer.Start();
+                                isopen=true;
+                        }
+                        else {
+                                close_timer.Disable();
+                                isopen=false;
+                        }
+                }
+                else { // alternative function
+                        close_timer.Start();
+                        isopen=true;
+                }
+        }
+}
+
+void Doors::ForceOpen(Mob *sender, bool alt_mode)
+{
+        EQApplicationPacket* outapp = new EQApplicationPacket(OP_MoveDoor, sizeof(MoveDoor_Struct));
+        MoveDoor_Struct* md=(MoveDoor_Struct*)outapp->pBuffer;
+        md->doorid = door_id;
+        md->action = invert_state == 0 ? OPEN_DOOR : OPEN_INVDOOR;
+        entity_list.QueueClients(sender,outapp,false);
+        safe_delete(outapp);
+
+        if(!alt_mode) { // original function
                if(!isopen) {
                        close_timer.Start();
                        isopen=true;
@@ -462,44 +503,59 @@
                        isopen=false;
                }
        }
+        else { // alternative function
+                close_timer.Start();
+                isopen=true;
+        }
 }
 
-void Doors::ForceOpen(Mob *sender)
+void Doors::ForceClose(Mob *sender, bool alt_mode)
 {
-    EQApplicationPacket* outapp = new EQApplicationPacket(OP_MoveDoor, sizeof(MoveDoor_Struct));
+        EQApplicationPacket* outapp = new EQApplicationPacket(OP_MoveDoor, sizeof(MoveDoor_Struct));
        MoveDoor_Struct* md=(MoveDoor_Struct*)outapp->pBuffer;
        md->doorid = door_id;
-        md->action = OPEN_DOOR;
+        md->action = invert_state == 0 ? CLOSE_DOOR : CLOSE_INVDOOR; // change from original (open to close)
        entity_list.QueueClients(sender,outapp,false);
        safe_delete(outapp);
 
-    if(!isopen) {
-        close_timer.Start();
-        isopen=true;
-    }
-    else {
-        close_timer.Disable();
-        isopen=false;
-    }
+        if(!alt_mode) { // original function
+                if(!isopen) {
+                        close_timer.Start();
+                        isopen=true;
+                }
+                else {
+                        close_timer.Disable();
+                        isopen=false;
+                }
+        }
+        else { // alternative function
+                if(isopen)
+                        close_timer.Trigger();
+        }
 }
 
-void Doors::ForceClose(Mob *sender)
+void Doors::ToggleState(Mob *sender)
 {
-    EQApplicationPacket* outapp = new EQApplicationPacket(OP_MoveDoor, sizeof(MoveDoor_Struct));
+        if(GetTriggerDoorID() > 0 || GetLockpick() != 0 || GetKeyItem() != 0 || opentype == 58 || opentype == 40) { // borrowed some NPCOpen criteria
+                return;
+        }
+
+        EQApplicationPacket* outapp = new EQApplicationPacket(OP_MoveDoor, sizeof(MoveDoor_Struct));
        MoveDoor_Struct* md=(MoveDoor_Struct*)outapp->pBuffer;
        md->doorid = door_id;
-        md->action = OPEN_DOOR;
+
+        if(!isopen) {
+                md->action = invert_state == 0 ? OPEN_DOOR : OPEN_INVDOOR;
+                isopen=true;
+        }
+        else
+        {
+                md->action = invert_state == 0 ? CLOSE_DOOR : CLOSE_INVDOOR;
+                isopen=false;
+        }
+
        entity_list.QueueClients(sender,outapp,false);
        safe_delete(outapp);
-
-    if(!isopen) {
-        close_timer.Start();
-        isopen=true;
-    }
-    else {
-        close_timer.Disable();
-        isopen=false;
-    }
 }
 
 void Doors::DumpDoor(){
Index: doors.h
===================================================================
--- doors.h        (revision 2153)
+++ doors.h        (working copy)
@@ -58,9 +58,10 @@
        int8        IsLDoNDoor() { return is_ldon_door; }
        int32        GetClientVersionMask() { return client_version_mask; }
       
-        void        NPCOpen(NPC* sender);
-        void        ForceOpen(Mob *sender);
-        void        ForceClose(Mob *sender);
+        void        NPCOpen(NPC* sender, bool alt_mode=false);
+        void        ForceOpen(Mob *sender, bool alt_mode=false);
+        void        ForceClose(Mob *sender, bool alt_mode=false);
+        void        ToggleState(Mob *sender);
 
        void        SetX(float in);
        void        SetY(float in);
Index: perlparser.cpp
===================================================================
--- perlparser.cpp        (revision 2153)
+++ perlparser.cpp        (working copy)
@@ -1921,30 +1921,68 @@
 XS(XS__forcedooropen)
 {
        dXSARGS;
-        if (items != 1)
-                Perl_croak(aTHX_ "Usage: forcedooropen(doorid)");
+        if (items < 1 || items > 2)
+                Perl_croak(aTHX_ "Usage: forcedooropen(doorid [, altmode=0])");
 
+        if (items == 1)
+        {
        int32        did = (int)SvIV(ST(0));
 
-        quest_manager.forcedooropen(did);
+        quest_manager.forcedooropen(did, false);
 
        XSRETURN_EMPTY;
+        }
+        else
+        {
+        int32        did = (int)SvIV(ST(0));
+        bool        am = (int)SvIV(ST(1)) == 0?false:true;
+
+        quest_manager.forcedooropen(did, am);
+
+        XSRETURN_EMPTY;
+        }
 }
 
 XS(XS__forcedoorclose);
 XS(XS__forcedoorclose)
 {
        dXSARGS;
-        if (items != 1)
-                Perl_croak(aTHX_ "Usage: forcedoorclose(doorid)");
+        if (items < 1 || items > 2)
+                Perl_croak(aTHX_ "Usage: forcedoorclose(doorid [, altmode=0])");
 
+        if (items == 1)
+        {
        int32        did = (int)SvIV(ST(0));
 
-        quest_manager.forcedoorclose(did);
+        quest_manager.forcedoorclose(did, false);
 
        XSRETURN_EMPTY;
+        }
+        else
+        {
+        int32        did = (int)SvIV(ST(0));
+        bool        am = (int)SvIV(ST(1)) == 0?false:true;
+
+        quest_manager.forcedoorclose(did, am);
+
+        XSRETURN_EMPTY;
+        }
 }
 
+XS(XS__toggledoorstate);
+XS(XS__toggledoorstate)
+{
+        dXSARGS;
+        if (items !=1)
+                        Perl_croak(aTHX_ "Usage: toggledoorstate(doorid)");
+
+        int32        did = (int)SvIV(ST(0));
+
+        quest_manager.toggledoorstate(did);
+
+        XSRETURN_EMPTY;
+}
+
 XS(XS__isdooropen);
 XS(XS__isdooropen)
 {
@@ -3421,6 +3459,7 @@
                newXS(strcpy(buf, "buryplayercorpse"), XS__buryplayercorpse, file);
                newXS(strcpy(buf, "forcedooropen"), XS__forcedooropen, file);
                newXS(strcpy(buf, "forcedoorclose"), XS__forcedoorclose, file);
+                newXS(strcpy(buf, "toggledoorstate"), XS__toggledoorstate, file);
                newXS(strcpy(buf, "isdooropen"), XS__isdooropen, file);
                newXS(strcpy(buf, "depopall"), XS__depopall, file);
                newXS(strcpy(buf, "depopzone"), XS__depopzone, file);
Index: questmgr.cpp
===================================================================
--- questmgr.cpp        (revision 2153)
+++ questmgr.cpp        (working copy)
@@ -1623,26 +1623,36 @@
        return Result;
 }
 
-void QuestManager::forcedooropen(int32 doorid) {
+void QuestManager::forcedooropen(int32 doorid, bool altmode) {
        Doors* d = entity_list.FindDoor(doorid);
        if(d){
                if(GetInitiator())
-                        d->ForceOpen(GetInitiator());
+                        d->ForceOpen(GetInitiator(), altmode);
                else if(GetOwner())
-                        d->ForceOpen(GetOwner());
+                        d->ForceOpen(GetOwner(), altmode);
        }
 }
 
-void QuestManager::forcedoorclose(int32 doorid) {
+void QuestManager::forcedoorclose(int32 doorid, bool altmode) {
        Doors* d = entity_list.FindDoor(doorid);
        if(d){
                if(GetInitiator())
-                        d->ForceClose(GetInitiator());
+                        d->ForceClose(GetInitiator(), altmode);
                else if(GetOwner())
-                        d->ForceClose(GetOwner());
+                        d->ForceClose(GetOwner(), altmode);
        }
 }
 
+void QuestManager::toggledoorstate(int32 doorid) {
+        Doors* d = entity_list.FindDoor(doorid);
+        if(d){
+                if(GetInitiator())
+                        d->ToggleState(GetInitiator());
+                else if(GetOwner())
+                        d->ToggleState(GetOwner());
+        }
+}
+
 bool QuestManager::isdooropen(int32 doorid) {
        Doors* d = entity_list.FindDoor(doorid);
        if(d){
Index: questmgr.h
===================================================================
--- questmgr.h        (revision 2153)
+++ questmgr.h        (working copy)
@@ -151,8 +151,9 @@
        bool summonallplayercorpses(int32 char_id, float dest_x, float dest_y, float dest_z, float dest_heading);
        int32 getplayerburriedcorpsecount(int32 char_id);
        bool buryplayercorpse(int32 char_id);
-        void forcedooropen(int32 doorid);
-        void forcedoorclose(int32 doorid);
+        void forcedooropen(int32 doorid, bool altmode);
+        void forcedoorclose(int32 doorid, bool altmode);
+        void toggledoorstate(int32 doorid);
        bool isdooropen(int32 doorid);
        void npcrace(int race_id);
        void npcgender(int gender_id);


Let me know if there are coding problems that I missed. (There still may be quirkness with some doors due to default db settings..I've started changing mine.)


U

Uleat 06-27-2012 02:48 AM

I was wondering if anyone had tried this last patch.

I can't test this under heavy-load conditions and was curious if anyone had seen any issues.


U

trevius 06-27-2012 03:08 AM

I haven't tested it and don't really have time to, but was considering just committing it to get it in and fix any reported issues after (if any). I looked through it briefly and don't see any issues that stand out.

Uleat 06-27-2012 04:04 AM

Thanks Trev! I was just looking for some feedback as to whether the changing of server close door actions to 'close_timer.Trigger()'
was going to cause any issues on heavy-load servers before I start looking at database change suggestions.

I'll keep an eye on it.


U

sorvani 06-27-2012 09:26 AM

the inverted stat stuff all worked on my test server. i would commit it, we can always revert it.

cavedude 06-29-2012 08:37 PM

I just committed this in Rev 2157.

blackdragonsdg 06-30-2012 01:26 AM

These changes combined with the script posted at the link below fixed the Vergalid lift issues.
Code:

http://www.eqemulator.org/forums/showthread.php?p=210539#post210539
I tried default and inverted db settings and the lift, ropes and switches all function as they should.


All times are GMT -4. The time now is 04:11 AM.

Powered by vBulletin®, Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.