Aller au contenu

Photo

Portal between Servers


  • Veuillez vous connecter pour répondre
8 réponses à ce sujet

#1
Jenna WSI

Jenna WSI
  • Members
  • 1 078 messages
What's the best way to set this up? I'd like you to be able to see the players in both servers on one list, regardless of which server you're on... and be able to talk to them. I've seen this done but I'm not sure how. A look through the vault turned up the following, but is it the best way to do this?

http://nwvault.ign.c...r.Detail&id=661
http://nwvault.ign.c...s.Detail&id=176
http://nwvault.ign.c...ts.Detail&id=48
http://nwvault.ign.c...s.Detail&id=139

#2
Jenna WSI

Jenna WSI
  • Members
  • 1 078 messages
Seems one of our linux guys can set up the servers, aside from the actual scripting portals part. So.. I'm curious if there's a way to use NWNx2 chat plugins to make server shouts go across both servers?

#3
Baaleos

Baaleos
  • Members
  • 1 322 messages
Cross Server shouts can 'possibly' be done on linux with a nwnx plugin.

I know there is alot of extensibility with the ruby plugin, but I think there was also a udp plugin too.

Basically, the problem you have, in trying to do cross server shouts, is that you need to send the information outside of nwn, and then receive it, and get it back into nwn on the otherside.

the UDP Plugin can send the data, I dont know about receiving it though.

Another way, would be to insert the data/shouts, into a common database/table, shared accross the 2 servers, when the second server sees a shout appear, it then relays it to all the players, and wipes it from the database, to prevent duplication.

#4
Jenna WSI

Jenna WSI
  • Members
  • 1 078 messages
Sounds plausible... thanks, I'll look at those plugins and ask our linux guys.

#5
Birdman076

Birdman076
  • Members
  • 186 messages
Almost positive HG has cross server shouts, might want to send a pm to Funky. There is also an NWNX_Vaultster plugin which I believe portals players between servers using the same server vault.

Modifié par Birdman076, 13 septembre 2011 - 10:52 .


#6
Jenna WSI

Jenna WSI
  • Members
  • 1 078 messages
Looking into doing this now. On the server I saw it done on, the players in the main part of the server were still on the player list even when you logged into the intro server... and you could talk to them in tells between servers or join thier party. Any info on how this is done?

#7
Calvinthesneak

Calvinthesneak
  • Members
  • 656 messages
Pretty sure it's a single server, using a nwnx plugin, I don't know the name off hand. Probing around on the nwnx Forums should yeild something.

#8
FunkySwerve

FunkySwerve
  • Members
  • 1 308 messages
Interservers are easy, just use a mysql database accessible to all the involved servers to put messages in, and retrieve them from module heartbeats and broadcast to the player or channel specified - doesn't have to be a linux server. Portalling doesn't even require nwnx. Here's our portal command:
            } else if (GetStringLeft(sCText, 7) == "portal ") {
                DeleteLocalString(oCPC, "FKY_CHAT_LOCAL_CTEXT");

                int nServer;
                sCText = GetStringRight(sCText, GetStringLength(sCText) - 7);

                if (GetIsInCombat(oCPC) && !VerifyDMKey(oCPC) && !VerifyAdminKey(oCPC)) {
                    FloatingTextStringOnCreature(COLOR_RED + "You cannot portal during combat!" + COLOR_END, oCPC, FALSE);
                    return;
                }

                if (sCText == "here")
                    nServer = StringToInt(GetLocalString(GetModule(), "ServerNumber"));
                else
                    nServer = StringToInt(sCText);

                if (nServer < 110 || nServer > 999) {
                    FloatingTextStringOnCreature(COLOR_RED + "You cannot portal to that server!" + COLOR_END, oCPC, FALSE);
                    return;
                }

                SQLExecDirect("SELECT srv_id, srv_utime, srv_addr, srv_port FROM server_list WHERE srv_id = " + IntToString(nServer) +
                              " AND srv_utime + 60 >= (UNIX_TIMESTAMP() - srv_btime)");

                if (SQLFetch() != SQL_SUCCESS) {
                    FloatingTextStringOnCreature(COLOR_RED + "That server is not active!" + COLOR_END, oCPC, FALSE);
                    return;
                }

                if (!VerifyAdminKey(oCPC) && StringToInt(SQLGetData(2)) < 60) {
                    FloatingTextStringOnCreature(COLOR_RED + "That server has not been up for a minute yet!" + COLOR_END, oCPC, FALSE);
                    return;
                }

                string sAddr = SQLGetData(3) + ":" + SQLGetData(4);
                FloatingTextStringOnCreature(COLOR_GREEN + "Portaling you to " + sAddr + "!" + COLOR_END, oCPC, FALSE);

                ActivatePortal(oCPC, sAddr, "", "", FALSE);
                SetPlotFlag(oCPC, FALSE);
            }

The servers are distinguished using the get port portion of the ip, which DOES require nwnx. The set a local on the server as it loads, so that all the servers can run the same version of the module. On pulling up the code to post it, I see we no longer do it that way. Instead, we now read from a file using another nwnx function, though we still do use the SQL code to check ip. Either way, if you're linking different ips, or if you just want to manaully enter the data in script for all the servers, you don't need this command - it just allows us to drop and add servers without recoding anything. Here's the load code, in two parts:

    string sSQL, sServerNumber = FileReadAll("serverid.txt");
    int nServerNumber = StringToInt(sServerNumber);

    if (nServerNumber >= 100) {
        sServerNumber = IntToString(nServerNumber);
    } else {
        string sServerIP;

        sSQL = "select substring_index(user(), '@', -1) as ip;";
        SQLExecDirect(sSQL);

        if (SQLFetch() == SQL_SUCCESS)
            sServerIP = SQLGetData(1);
        else
            sServerIP == "";

        sServerNumber = GetStringRight(sServerIP, 3);
        nServerNumber = StringToInt(sServerNumber);
    }

    if ((nServerNumber >= 100) && (nServerNumber <= 999)) {
        WriteTimestampedLogEntry("running as server " + sServerNumber + " (module object " + ObjectToString(GetModule()) + ")");
        SetLocalString(OBJECT_SELF, "ServerNumber", sServerNumber);
    } else {
        WriteTimestampedLogEntry("Error finding server ip!");

        nServerNumber = 101;
        sServerNumber = "101";

        SetLocalString(OBJECT_SELF, "ServerNumber", "101");
    }

    if (nServerNumber % 10 == 9) {
        SetLocalInt(oMod, "FKY_CHAT_ENABLE_PARTY_TO_AREA", 1);
        SetLocalInt(oMod, "FKY_CHAT_ENABLE_SHOUT_TO_AREA", 1);
        SetLocalInt(oMod, "FKY_CHAT_ENABLE_TELL_OOC_PREFIX", 1);
        SetLocalInt(oMod, "FKY_CHAT_DISALLOW_SPEECH_WHILE_DEAD", 1);
        SetLocalInt(oMod, "FKY_CHAT_DISALLOW_SPEECH_WHILE_SILENCED", 1);
    }


Here's part 2:


    if (SQLFetch() == SQL_SUCCESS) {
        string sBootTime = SQLGetData(1);
        string sServerAddr = FileReadAll("serveraddr.txt");
        string sServerPort = FileReadAll("serverport.txt");

        if (StringToInt(sServerPort) < 5000)
            sServerPort = "512" + IntToString(nServerNumber % 10);

        SetLocalInt(oMod, "boottime", StringToInt(sBootTime));
        SetLocalString(oMod, "ServerAddr", sServerAddr);
        SetLocalString(oMod, "ServerPort", sServerPort);

        SQLExecDirect("REPLACE INTO server_list (srv_id, srv_btime, srv_utime, srv_memory, srv_players, srv_addr, srv_port, srv_last) VALUES ('"
                      + sServerNumber + "', " + sBootTime + ", 0, 0, 0, '" + sServerAddr + "', " + sServerPort + ", NOW())");
    }

LMK if you have any questions.

Funky

Modifié par FunkySwerve, 01 novembre 2011 - 06:14 .


#9
Calvinthesneak

Calvinthesneak
  • Members
  • 656 messages
Can read info here: http://www.nwnx.org/...er=asc&start=15

Page 2 contains a supposedly fixed plugin.   This comes with it's own issues, read all the posts on page 2 and you'll understand better.


nwnx_haks
- New alpha plugin. Allows abitrarily hiding haks and setting a
fallback TLK for players logging in. Currently the script that
checks whether a login is 'enhanced' or not is hardcoded. Haks
can be hidden by level. E.g. a 'basic level' (1) that includes
a top hak with custom classes & a 'full level' that includes
tilesets, etc. It would be up to the builder to ensure that
a player didn't go places that had content he/she did not have the
haks to see. I use it to add custom haks and also a fallback
to CEP and hiding server side HAKs from players.
- Functions: exposed to scripts
int SetFallBackTLK(string sTLK);
int SetHakHidden(string sHak, int nLevel = 1);
void DumpHakList();
void SetPlayerEnhanced(object oPC, int nEnhanced);


Modifié par Calvinthesneak, 01 novembre 2011 - 03:42 .