View previous topic :: View next topic |
Author |
Message |
Mycohl
Joined: 21 Oct 2006 Posts: 8
|
Posted: Mon Dec 28, 2009 21:33 Post subject: |
|
|
virusman wrote: | Yes, you have to initialize GetLocalObject hook:
GetLocalObject(GetModule(), "NWNX!INIT"); |
I am doing this. This is what causes the lines:
* NWNX2 activated.
name='NWNX!INIT'
INIT(S): valid ret=0x082041ec
to show up in the log. |
|
Back to top |
|
|
virusman
Joined: 30 Jan 2005 Posts: 1020 Location: Russia
|
Posted: Mon Dec 28, 2009 21:52 Post subject: |
|
|
You're initializing only the SetLocalString hook. You need both hooks in order for NWNX Areas to work properly. _________________ In Soviet Russia, NWN plays you! |
|
Back to top |
|
|
Mycohl
Joined: 21 Oct 2006 Posts: 8
|
Posted: Mon Dec 28, 2009 22:27 Post subject: |
|
|
Crap. I am an idiot, and I apologize for wasting your time.
I didn't realize there was a separate call needed for this. Where can I find more information about what initialization needs to be done for the various plugins in the SVN? I don't want to waste everyone's time all over again when I start messing with another plugin, but the documentation doesn't seem to exist on the SVN (or else I am not seeing it). |
|
Back to top |
|
|
Fireboar
Joined: 17 Feb 2008 Posts: 323
|
Posted: Tue Dec 29, 2009 21:28 Post subject: |
|
|
Code: | disablenwnxinit=y #Set to "y" to not enforce the NWNX!INIT requirement |
Problem solved, surely? |
|
Back to top |
|
|
virusman
Joined: 30 Jan 2005 Posts: 1020 Location: Russia
|
Posted: Sat Jan 16, 2010 19:33 Post subject: |
|
|
NWNX Areas 0.3.0 (Linux)
http://nwn.virusman.ru/trac/nwnx2-linux/changeset/291/
http://data.virusman.ru/nwn/nwnx_areas-0.3.0-linux.rar
- Fixed the crash that was happening when a player was trying to enter the new area after removing any other area
- DMs now see the new area in Creator immediately
- Added SetAreaName function
NWNX Areas is officially out of 'experimental' stage and can be considered stable. _________________ In Soviet Russia, NWN plays you!
Last edited by virusman on Sat Jan 16, 2010 19:47; edited 1 time in total |
|
Back to top |
|
|
Baaleos
Joined: 02 Sep 2007 Posts: 830
|
Posted: Sat Jan 16, 2010 19:38 Post subject: Cool |
|
|
Any new goodies for windows?
Eg - has there been any success on windows systems of making the new areas display correctly?
Eg - players be in the game, at the same time as the area created, and not get nothing but black?
At the minute, im having to generate my areas on Mod Load, before players join. |
|
Back to top |
|
|
MaxRock
Joined: 24 Jan 2008 Posts: 196
|
Posted: Thu Jun 03, 2010 5:55 Post subject: Re: Cool |
|
|
Baaleos wrote: | Any new goodies for windows?
Eg - has there been any success on windows systems of making the new areas display correctly?
Eg - players be in the game, at the same time as the area created, and not get nothing but black?
At the minute, im having to generate my areas on Mod Load, before players join. |
Yes, actually it works quite nicely on windows
I've copied the code for loading and adding the area to a players area list using the structs from nwnx_funcs for windows. And it works under certain conditions. Or rather it fails under a certain condition but I think that has to do with the resman plugin.
If Virusman has no objections I would like to attempt to make a full windows port of the linux version. |
|
Back to top |
|
|
MaxRock
Joined: 24 Jan 2008 Posts: 196
|
Posted: Fri Jun 04, 2010 5:02 Post subject: |
|
|
Is DestroyArea supposed to delete all the objects in the area as well, or do I have to do that separately? |
|
Back to top |
|
|
MaxRock
Joined: 24 Jan 2008 Posts: 196
|
Posted: Sat Jul 31, 2010 22:29 Post subject: Blackout |
|
|
We have some problems with the windows version and I wanted to ask if they're the same in linux:
- Create a new area (an inside one, e.g.: City Interior)
- Go to the area
- Log out
- Log back in
-> The area is black! |
|
Back to top |
|
|
Baaleos
Joined: 02 Sep 2007 Posts: 830
|
Posted: Sat Jul 31, 2010 22:57 Post subject: Note - Change of behavior |
|
|
When I used the early release areas plugin when it was first released by virusmas, the behavior was different.
The area would appear black to everyone in the server, if they had logged in before the area was made.
The resolution at the time, or rather, work around, was to generate the areas at the begining, during onModload. This meant that when the players joined, they received the minimaps etc and area data via the internal nwn client enter function, and the areas continued to function correctly, even after log outs.
Since the new version which I have used from your own branch, the change in behavior is that because your version has a SendAreaToCreatures function, which the first one lacked on a windows version. The areas will display if we are logged in when they are made.
However, logging out, and then back in, it is like the area minimaps are lost during this log out and in attempt.
My own makeshift function to 'resend' minimaps to the player, does work in that it makes the area visible again, but because it is adding the minimap to the ExoArray for the creature again, its possibly gonna cause problems in the long run. (eg - the Creatures Area Count increases continuously).
This might sound stupid, but is there perhaps a function that needs to be called, to 'Save' the area data, once it has been added to the Creature?
Perhaps the Save function, if one exists, is called on the first initial login per client, and anything else gained by the client, is shrugged off between logins? |
|
Back to top |
|
|
axs
Joined: 11 Feb 2005 Posts: 76
|
Posted: Thu Aug 12, 2010 19:06 Post subject: |
|
|
MaxRock, I didn't noticed such effect.
I've used nwnx_areas in conjunction with nwnx_resman for dynamicaly added areas by DMs but I have to stop becouse server crashes often.
Once sometime when player disconnects.
Code: | #0 0xb7de79f6 in memcpy () from /lib/libc.so.6
#1 0x0000014a in ?? ()
#2 0x080606e9 in CNWSPlayerTURD::CopyAutomapData(int, CExoArrayList<unsigned long> *, unsigned char **) ()
#3 0x0805434c in CNWSPlayer::DropTURD(void) ()
#4 0x080a4ead in CServerExoAppInternal::RemovePCFromWorld(CNWSPlayer *) ()
#5 0x080a24f4 in CServerExoAppInternal::PlayerListChange(unsigned long, int, int) ()
#6 0x082aa08c in CNetLayerInternal::DisconnectPlayer(unsigned long, unsigned long, int, int) ()
#7 0x082a71ea in CNetLayerInternal::NonWindowMessages(unsigned long, unsigned char *, unsigned long) ()
#8 0x082a0744 in CNetLayerInternal::ProcessReceivedFrames(int) ()
#9 0x080a04f4 in CServerExoAppInternal::MainLoop(void) ()
#10 0x0804bbe7 in main () |
And second sometime when player enters created area (I think it's related with minimap update):
Code: | #0 0x0806ef39 in CNWSMessage::WriteGameObjUpdate_PlayerUpdate(CNWSPlayer *, CNWSPlayerLastUpdateObject *, CLastUpdateObject *, unsigned short) ()
#1 0x0806d113 in CNWSMessage::WriteGameObjUpdate_MajorGUIPanels(CNWSPlayer *) ()
#2 0x0806ba41 in CNWSMessage::SendServerToPlayerGameObjUpdate(CNWSPlayer *, unsigned long) ()
#3 0x0808036e in CNWSMessage::SendServerToPlayerGameObjUpdate(CNWSPlayer *) ()
#4 0x080a4b87 in CServerExoAppInternal::UpdateClientGameObjectsForPlayer(CNWSPlayer *, int, unsigned long long) ()
#5 0x080b0275 in CServerExoAppInternal::UpdateClientGameObjects(int) ()
#6 0x080a053e in CServerExoAppInternal::MainLoop(void) ()
#7 0x0804bbe7 in main ()
|
|
|
Back to top |
|
|
virusman
Joined: 30 Jan 2005 Posts: 1020 Location: Russia
|
Posted: Fri Aug 13, 2010 11:39 Post subject: |
|
|
axs wrote: | MaxRock, I didn't noticed such effect.
I've used nwnx_areas in conjunction with nwnx_resman for dynamicaly added areas by DMs but I have to stop becouse server crashes often.
Once sometime when player disconnects.
Code: | #0 0xb7de79f6 in memcpy () from /lib/libc.so.6
#1 0x0000014a in ?? ()
#2 0x080606e9 in CNWSPlayerTURD::CopyAutomapData(int, CExoArrayList<unsigned long> *, unsigned char **) ()
#3 0x0805434c in CNWSPlayer::DropTURD(void) ()
#4 0x080a4ead in CServerExoAppInternal::RemovePCFromWorld(CNWSPlayer *) ()
#5 0x080a24f4 in CServerExoAppInternal::PlayerListChange(unsigned long, int, int) ()
#6 0x082aa08c in CNetLayerInternal::DisconnectPlayer(unsigned long, unsigned long, int, int) ()
#7 0x082a71ea in CNetLayerInternal::NonWindowMessages(unsigned long, unsigned char *, unsigned long) ()
#8 0x082a0744 in CNetLayerInternal::ProcessReceivedFrames(int) ()
#9 0x080a04f4 in CServerExoAppInternal::MainLoop(void) ()
#10 0x0804bbe7 in main () |
And second sometime when player enters created area (I think it's related with minimap update):
Code: | #0 0x0806ef39 in CNWSMessage::WriteGameObjUpdate_PlayerUpdate(CNWSPlayer *, CNWSPlayerLastUpdateObject *, CLastUpdateObject *, unsigned short) ()
#1 0x0806d113 in CNWSMessage::WriteGameObjUpdate_MajorGUIPanels(CNWSPlayer *) ()
#2 0x0806ba41 in CNWSMessage::SendServerToPlayerGameObjUpdate(CNWSPlayer *, unsigned long) ()
#3 0x0808036e in CNWSMessage::SendServerToPlayerGameObjUpdate(CNWSPlayer *) ()
#4 0x080a4b87 in CServerExoAppInternal::UpdateClientGameObjectsForPlayer(CNWSPlayer *, int, unsigned long long) ()
#5 0x080b0275 in CServerExoAppInternal::UpdateClientGameObjects(int) ()
#6 0x080a053e in CServerExoAppInternal::MainLoop(void) ()
#7 0x0804bbe7 in main ()
|
| Do you remove areas anywhere in your code?
The current area deletion code doesn't do proper minimap cleanup: it can result in blackout for players. _________________ In Soviet Russia, NWN plays you! |
|
Back to top |
|
|
axs
Joined: 11 Feb 2005 Posts: 76
|
Posted: Wed Aug 18, 2010 0:45 Post subject: |
|
|
virusman wrote: | Do you remove areas anywhere in your code?
The current area deletion code doesn't do proper minimap cleanup: it can result in blackout for players. | Yeah I know, so I've deleted area removal code, but didn't help.
Now when I reverted to old method - areas are added to module permanently (by Moneo/LETO) just before server starts, there is no such crashes.
So it's most likely related to area loading by nwnx_areas, I'm realy sad with this fact. |
|
Back to top |
|
|
Nabla
Joined: 19 Aug 2010 Posts: 4
|
Posted: Thu Aug 19, 2010 19:20 Post subject: |
|
|
I have recently installed and tested this plugin. I like it a lot. And I have begining to look the source code for adapting the plugin to my need.
In this process, i have found the following bug in the destroy fonction.
- When we delete a empty area (with no object in it) the server segfault.
I think that the solution is to change in HookFunc.cpp the function NWNXDestroyArea by
Code: |
if(CNWSArea__GetFirstObjectInArea(pArea, &nTmpObj)){
do{
CGameObject *pObject = (CGameObject *) CServerExoAppInternal__GetGameObject((void *)pServInternal, nTmpObj);
...
}
while(CNWSArea__GetNextObjectInArea(pArea, &nTmpObj));
}
|
In the same function,
Code: | pDestructor(pObject, 3); |
Seem to only delete pObject, not the non pObject part of pCreature. This result in a memory leak.
Edit:
After a litle of work, it seem, that the while loop need to be modified in the following way:
Code: |
while(CNWSArea__GetFirstObjectInArea(pArea, &nTmpObj));
|
I think that it is because the destructor destroy the first object. And change the list of object.
I have changed the end of the function in adding the unload and desctructor function.
Like this the first test show that it work correctly.
The code used was:
Code: |
void NWNXDestroyArea(void *pModule, dword nAreaID)
{
if(!nAreaID || nAreaID == OBJECT_INVALID)
return;
if(!pServInternal)
InitConstants();
areas.Log(2, "Unregistering area %08lX\n", nAreaID);
void *pArray = ((dword *)pModule+0x7);
CExoArrayList__Remove(pArray, nAreaID);
areas.Log(2, "Destroying objects on area %08lX\n", nAreaID);
CNWSArea *pArea = (CNWSArea *) GetAreaByGameObjectID((void *)pServInternal, nAreaID);
if(pArea->NumPlayers > 0)
{ cout<<"destroy aborted"<<endl;
areas.Log(1, "NumPlayers > 0, aborting\n");
return;
}
dword nTmpObj;
if(CNWSArea__GetFirstObjectInArea(pArea, &nTmpObj)){
do{
CGameObject *pObject = (CGameObject *) CServerExoAppInternal__GetGameObject((void *)pServInternal, nTmpObj);
void (*pDestructor)(CGameObject *pthis, int flag) =
(void (*)(CGameObject *pthis, int flag))(*(dword*)((dword*)(pObject->Methods)+0x2));
areas.Log(2, "Destroying object %08lX\n", nTmpObj);
pDestructor(pObject,3);
}
while(CNWSArea__GetFirstObjectInArea(pArea, &nTmpObj));
}
areas.Log(0, "Destroying area %08lX\n", nAreaID);
CNWSArea__UnloadArea(pArea);
CNWSArea__Destructor(pArea);
RemoveAreaForCreatures((CNWSModule *)pModule, nAreaID);
UpdateAreasForDMs();
} |
|
|
Back to top |
|
|
axs
Joined: 11 Feb 2005 Posts: 76
|
Posted: Mon Oct 25, 2010 18:52 Post subject: |
|
|
I'm wondering if only I have a problem.
Most likely minimap tiles data are not reallocated properly in some circumstances on large server, there is no way to crash server localy while testing, but when there is lot of players and action it's happen often.
It's related mostly to PlayerUpdateObject, DMs Un/Possession.
Code: | #0 0xb7d9b9f6 in memcpy () from /lib/libc.so.6
#1 0x0000019f in ?? ()
#2 0x080606e9 in CNWSPlayerTURD::CopyAutomapData(int, CExoArrayList<unsigned long> *, unsigned char **) ()
#3 0x0805434c in CNWSPlayer::DropTURD(void) ()
#4 0x080a4ead in CServerExoAppInternal::RemovePCFromWorld(CNWSPlayer *) ()
#5 0x080a24f4 in CServerExoAppInternal::PlayerListChange(unsigned long, int, int) ()
#6 0x082aa08c in CNetLayerInternal::DisconnectPlayer(unsigned long, unsigned long, int, int) () |
Code: | #0 0x0810e8d8 in CNWSCreature::UnpossessCreature(void) ()
#1 0x08113430 in CNWSCreature::UnpossessCreatureDM(void) ()
#2 0x08165fd0 in CNWSDungeonMaster::PossessCreature(unsigned long, unsigned char) ()
#3 0x08188762 in CNWSMessage::HandlePlayerToServerDungeonMasterMessage(CNWSPlayer *, unsigned char, int) ()
#4 0x08196905 in CNWSMessage::HandlePlayerToServerMessage(unsigned long, unsigned char *, unsigned long) () |
|
|
Back to top |
|
|
|
|
You cannot post new topics in this forum You cannot reply to topics in this forum You cannot edit your posts in this forum You cannot delete your posts in this forum You cannot vote in polls in this forum
|
Powered by phpBB © 2001, 2005 phpBB Group
|