Massassi Forums Logo

This is the static archive of the Massassi Forums. The forums are closed indefinitely. Thanks for all the memories!

You can also download Super Old Archived Message Boards from when Massassi first started.

"View" counts are as of the day the forums were archived, and will no longer increase.

ForumsCog Forum → Multiplayer sync issues
Multiplayer sync issues
2002-01-07, 3:36 PM #1
I know I've posted this before, but as yet I have found nor recieved any fix for it.

What happens is the hostage is synced until a player activates him. So if you push him round without activating him then both computers see him in the same place.

When the user activates on him the hostage on his computer follows him. But then another computer will only see in the place he was before he was activated.

Each user can kill each others hostage. I'm guessing its got something to do with a certian flag dormouse has used, not sure. Any help would be greatly appreciated!

Code:
# ===BoF=== #
#
# JK Team Battle Cog Script
#
# ACTOR_HOSTAGE.COG
#
# Hostage actor cog for JK TB TC
#
# [Dormouse -- LapsusLinguae@juno.com]
#      [http://dormouse.cjb.net/]
# 
# === #

flags=0x404

symbols

message	startup
message created
message	pulse
message activated
message touched
message killed

template	hostage_tpl=hostage	local
thing		hostageStart=179

thing		hostage		local
sector		sectorRescue=109

int		isReleased=0	local
int		isRescued=0	local
int		isMobile=0	local

thing		player		local

#---#

  end

#===#

  code

#---#

startup:

player = GetLocalPlayerThing();
hostage = CreateThingNR(hostage_tpl , hostageStart);

if(isMulti())
{
 SetActorFlags(hostage , 0x40000);
 isMobile = 0;
 isReleased = 0;
 isRescued = 0;
}

return;

#---#

created:

SetPulse(0.1);

if(!isMulti())
{
 hostage = GetSenderRef();
 SetActorFlags(hostage , 0x40000);
 isMobile = 0;
}

return;

#---#

pulse:		

AISetMode(hostage , 0x2009);
AISetMoveSpeed(hostage , 3);
AISetLookPos(hostage , GetThingPos(player));
AISetMovePos(hostage , GetThingPos(player));
SyncThingPos(hostage);

if(GetThingSector(hostage) == sectorRescue)
{
 print("-=HOSTAGE RESCUED!=-");
 SetActorFlags(hostage , 0x40000);
 StopThing(hostage);
 ClearAIMode(hostage , 0x2009);
 SetPulse(0);
 isRescued=1;
 ChangeInv(player , 152 , 500);
}

return;

#---#			

activated:

if(isRescued) return;

if(isMobile == 0)
{
 ClearActorFlags(hostage , 0x40000);
 isMobile = 1;
 if(isReleased == 0)
 {
AISetLookPos(hostage , GetThingPos(player));
AISetMovePos(hostage , GetThingPos(player));
SyncThingPos(hostage);
jkStringClear();
  jkStringConcatAsciiString("Marty says: 'Ok, '");
  jkStringConcatPlayerName(player);
  jkStringConcatAsciiString(". I'm Right behind you!'");
  jkStringOutput(player , -1);
  jkStringClear();
  isReleased = 1;
 }
 return;
}
else if(isMobile == 1)
{
 Print("You Say: 'STAY THERE!'");
 SetActorFlags(hostage , 0x40000);
 isMobile = 0;
 return;
}

return;

#---#

touched:

if((GetSourceRef() == player) || (GetSenderRef() == player)) StopThing(hostage);

return;

#---#

killed:

jkStringClear();
jkStringConcatAsciiString("-=HOSTAGE KILLED BY: ");
jkStringConcatPlayerName(GetSourceRef());
jkStringConcatAsciiString("!=-");
jkStringOutput(-3 , -1);
jkStringClear();

return;

#---#
			
  end

# ===EoF=== #
Team Battle.
2002-01-08, 6:33 AM #2
This is just a piece of advice I heard a while back, but it didn't work for me so it probably won't work. You can try it anyway. Instead of it being a local cog (one user) make it say global instead of local. Global influences it on everyone's computer. It didn't work for me though so I'm not sure. Try it if you want.

------------------
Ohh Crap! - Darien Fawkes (The Invisible Man)
Ohh Crap! - Darien Fawkes (The Invisible Man)
2002-01-08, 6:37 AM #3
And your guess is right. There is no 0x400 for cogs and I doubt there's a 0x4 flag. -Dormouse most likely got those flags from an untested example at Millennium.

I think the flag you're looking for is 0x200. This means, according to the JKSpecs, that "cog results are not broadcast to other computers."

----

What are you using the 0x2000 AI Mode flag for? And why are you setting the 0x9 modes?

----

It's AIClearMode() and not ClearAIMode().

----

The senderref of the touched message is never going to be the player because the cog is not receiving his messages.

Remember that touched: is called when an object is "touched", and not when the object touches something. For example, the player touches a surface; touched runs in the surface's cog, but does not run in the player's cog.

------------------
More matter with less art.
Author of the JK DataMaster, Parsec, Scribe, and the EditPlus Cog Files.
2002-01-08, 7:03 AM #4
Quote:
<font face="Verdana, Arial" size="2">Originally posted by SaberMaster:
And your guess is right. There is no 0x400 for cogs and I doubt there's a 0x4 flag. -Dormouse most likely got those flags from an untested example at Millennium.

I think the flag you're looking for is 0x200. This means, according to the JKSpecs, that "cog results are not broadcast to other computers."

----

What are you using the 0x2000 AI Mode flag for? And why are you setting the 0x9 modes?

----

It's AIClearMode() and not ClearAIMode().

----

The senderref of the touched message is never going to be the player because the cog is not receiving his messages.

Remember that touched: is called when an object is "touched", and not when the object touches something. For example, the player touches a surface; touched runs in the surface's cog, but does not run in the player's cog.

</font>


the 0x9 is the hostage has a look-target and a move-target and is looking / moving towards.

i don't remember where the 0x400 came from , i think it was from milenium thuogh.

as to the touched thing , that's to stop the hostage when he bumps into the player. this is good , cuz before he would tend to push the player off of ledges and such.
Also, I can kill you with my brain.
2002-01-08, 10:45 AM #5
So you visit the Cog Forum, Dormouse? I thought you'd left cogging.

>>i think it was from milenium thuogh.

I'm pretty sure it was in Hideki's "Using Custom Projectiles in Multi Player Games" tutorial. There was a post about it a long while ago and the error was corrected.

>>as to the touched thing , that's to stop the hostage when he bumps into the player.

Because the cog is not receiving messages from the player, the senderref of the touched message cannot be the player. So you don't need to check both the sender and source for the player.

------------------
More matter with less art.
Author of the JK DataMaster, Parsec, Scribe, and the EditPlus Cog Files.
2002-01-08, 12:45 PM #6
SaberMaster - if I use the 0x200 flag it does not sync the hostage. [http://forums.massassi.net/html/frown.gif]
Team Battle.
2002-01-09, 7:42 AM #7
Sorry about that double post, lost my cable connection for a while.

---

Now that I think about it, that cog looks all wrong. Let me look through it carefully...

[edit]
Yeah, that cog is a mess. No way it could work in multiplayer.

I just spent the last one and a half hours fixing up that hostage cog. The result is a complicated server/client system that I *think* will work. But as with any other cog, it needs to be tested.

So if you'll send me your level, I'll test the cog and work out the inevitable bugs as well as I can. [http://forums.massassi.net/html/wink.gif]

------------------
More matter with less art.

[This message has been edited by SaberMaster (edited January 09, 2002).]
Author of the JK DataMaster, Parsec, Scribe, and the EditPlus Cog Files.
2002-01-09, 4:39 PM #8
no , i still cog some , and edit some[as youll see in the showcase forum].

just on my own schedule. (:

and that cog wasn't half-bad for being written entirely from scratch like , well , a while ago. it works great in sp. (:
Also, I can kill you with my brain.
2002-01-09, 8:19 PM #9
hehe, Dormouse is a singleplayer man and he wrote that feb last year. [http://forums.massassi.net/html/eek.gif]

I actually dont have much of a test level, but I will send you the temporary level mouse put it in. The level gob is run in patch commander and has a few other cogs in it. Thank you very very very much for helping us so much. You wont believe how much this helps us. I've emailed it to sabermastery@yahoo.com your profile email address.
[edit]wrong smily [http://forums.massassi.net/html/redface.gif][/edit]

[This message has been edited by Hellcat (edited January 10, 2002).]
Team Battle.
2002-01-10, 4:50 PM #10
You're certainly welcome, Hellcat, but I have some bad news. [http://forums.massassi.net/html/frown.gif] I'm leaving on a two-day trip tomorrow, and I don't have time to get this cog working with MP. -The MP system is there, but the main problem is that SyncThingPos() refuses to work.

Of course, I'll finish the cog when I get back, but perhaps someone here will fix the MP problems and save you the time.

The unfinished code:
Code:
# Actor_hostage.cog
#
# [SM + Dormouse]
#=========================================================#
symbols

message	startup
message	pulse
message	activated
message	killed
message	trigger
message	touched

template	htemp=hosttemp		local

thing		gpos=179			local
thing		activator				local
thing		toucher				local
thing		hostage				local

sector	sectorRescue=109		local

vector	center				local
vector	lvec					local

flex		zdiff					local
flex		dist					local

int		isReleased			local
int		isRescued			local
int		isMobile				local
int		count				local

end
#=========================================================#
code
#------------------------------------------------------------------------------
startup:
	// All players run this code.
	hostage=CreateThing(htemp, gpos);
	CaptureThing(hostage);
	AISetMoveSpeed(hostage , 3);
	isReleased=0;
	isRescued=0;
	isMobile=0;
	SetPulse(0.1);

Return;
#------------------------------------------------------------------------------
pulse:
	// All players run this line.
	if(GetThingSector(hostage) == sectorRescue && !IsRescued) call rescue;

	// Only the host runs this code
	if(IsServer())		// Sync the position of the hostage every 2 secs. -ERROR HERE: POS IS NOT SYNCED.
	{
		count=count+1;
		if(count > 20)
		{
			count=0;
			SyncThingPos(hostage);
			Print("Syncing");
		}
	}

	// All players run this code.
	if(IsMobile && !IsRescued)
	{
		dist=VectorDist(GetThingPos(activator), GetThingPos(hostage));
		if(dist > 0.22)
		{
			AISetLookPos(hostage, GetThingPos(activator));	// Move to and look at the activator.
			AISetMovePos(hostage, GetThingPos(activator));
		}
		else AIClearMode(hostage, 0x1);
	}

Return;
#------------------------------------------------------------------------------
activated:
	// Only let this message run on the activating player's machine.
	if(jkGetLocalPlayer() != GetSourceRef()) Return;

	if(isRescued)
	{
		jkStringClear();
		jkStringConcatAsciiString("Marty says: 'Thanks a lot, ");
		jkStringConcatPlayerName(activator);
		jkStringConcatAsciiString("!'");
		jkStringOutput(-3, -1);
		Return;
	}
	activator=GetSourceRef();

	if(!isMobile)	// Player activates the immobilized actor.
	{
		isMobile=1;
		if(isReleased) Print("Marty says: 'I'm ready to go.'");	// Assume the actor has been paused.
		else											// Assume the actor was just released.
		{
			jkStringClear();
			jkStringConcatAsciiString("Marty says: 'Ok, '");
			jkStringConcatPlayerName(activator);
			jkStringConcatAsciiString(". I'm right behind you!'");
			jkStringOutput(-3, -1);
			isReleased=1;
		}
	}
	else		// Player activates the moveable actor...
	{
		Print("You Say: 'Stay there.'");
		isMobile=0;
	}

	SendTrigger(-1, 801, isMobile, isReleased, activator, 0);

Return;
#------------------------------------------------------------------------------
killed:
	// Runs on all computers.
	SetPulse(0);
	jkStringClear();
	jkStringConcatAsciiString("-=HOSTAGE KILLED BY: ");
	jkStringConcatPlayerName(GetThingParent(GetSourceRef()));
	jkStringConcatAsciiString("!=-");
	jkStringOutput();

Return;
#------------------------------------------------------------------------------
rescue:
	// Runs on all computers
	isRescued=1;
	zdiff=VectorZ(GetSectorCenter(sectorRescue)) - VectorZ(GetThingPos(hostage));
	center=VectorAdd(GetSectorCenter(sectorRescue), VectorSet(0, 0, -zdiff));
	AISetMovePos(hostage, center);
	AiSetLookPos(hostage, center);
	ChangeInv(jkGetLocalPlayer(), 152 , 500);
	Print("-=HOSTAGE RESCUED!=-");

Return;
#------------------------------------------------------------------------------
trigger:
	// Runs on all computers
	if(GetSourceRef() == 801)
	{
		jkStringClear();
		jkStringConcatAsciiString("Trigger Received.");
		jkStringOutput();
		isMobile=GetParam(0);
		isReleased=GetParam(1);
		activator=GetParam(2);
	}

Return;
#------------------------------------------------------------------------------
touched:
	// Runs on all computers. Player pos will not be the same on all comps and the host will most likely foul this up a bit.
	toucher=GetSourceRef();
	if(GetThingType(toucher) != 10 || !isReleased) Return;
	lvec=VectorSub(GetThingPos(toucher), GetThingPos(hostage));
	ApplyForce(hostage, VectorScale(VectorNorm(lvec), -2));

Return;
#------------------------------------------------------------------------------
end


------------------
More matter with less art.
Author of the JK DataMaster, Parsec, Scribe, and the EditPlus Cog Files.
2002-01-10, 8:05 PM #11
If the pos of the hostage is only synced from the sever then if the client activated the hostage would that work ok?

I have no idea when it comes to this kind of cogging [http://forums.massassi.net/html/eek.gif]

Thank you very much for helping us!!! I'm not in a huge hurry so its ok. But if anyone else can help it would be great.
Team Battle.
2002-01-14, 12:52 PM #12
The hostage is supposed to move locally on each computer. The host will send his pos out to the clients to make sure the hostage stays synced.

When the hostage is activated, a trigger is sent out to the other computers (and the host); that will make the hostage move locally and the server will keep them synced.

Problem is, the trigger and the pos syncing don't work in that cog. I'll work on it some. [http://forums.massassi.net/html/wink.gif]

------------------
More matter with less art.
Author of the JK DataMaster, Parsec, Scribe, and the EditPlus Cog Files.
2002-01-14, 9:58 PM #13
Ok, I understand now. Thanks very much.
Team Battle.
2002-01-15, 12:30 PM #14
Ok, I have completed the hostage cog:

Code:
# Actor_hostage.cog
#
# [SM + Dormouse]
#=========================================================#
flags=0x240
symbols

message	startup
message	pulse
message	activated
message	killed
message	trigger
message	touched
message	join

thing		gpos=179			local
thing		activator				local
thing		toucher				local
thing		hostage				local
thing		posghost				local
thing		killer				local

sector	sectorRescue=109		local

vector	center				local
vector	lvec					local
vector	syncpos				local
vector	curpos				local
vector	curlvec				local
vector	synclvec				local

flex		zdiff					local
flex		dist					local

int		isReleased			local
int		isRescued			local
int		isMobile				local
int		count				local
int		dead				local

end
#=========================================================#
code
#------------------------------------------------------------------------------
startup:
	// All players run this code.
	hostage=CreateThing(LoadTemplate("hosttemp"), gpos);
	CaptureThing(hostage);
	AISetMoveSpeed(hostage , 3);
	isReleased=0;
	isRescued=0;
	isMobile=0;
	dead=0;
	SetPulse(0.1);

Return;
#------------------------------------------------------------------------------
pulse:
	// All players run this line.
	if(GetThingSector(hostage) == sectorRescue && !IsRescued && !dead) call rescue;

	// Only the host runs this code
	if(IsServer())		// Sync the position of the hostage every half a second.
	{
		count=count+1;
		if(count > 5)
		{
			count=0;
			curpos=GetThingPos(hostage);
			curlvec=GetThingLVec(hostage);
			SendTrigger(-1, 800, VectorX(curpos), VectorY(curpos), VectorZ(curpos), 0);
			SendTrigger(-1, 801, VectorX(curlvec), VectorY(curlvec), VectorZ(curlvec), GetThingSector(hostage));
			SendTrigger(-1, 803, GetThingHealth(hostage), 0, 0, 0);
		}
	}

	// All players run this code.
	if(IsMobile && !IsRescued)
	{
		dist=VectorDist(GetThingPos(activator), GetThingPos(hostage));
		if(dist > 0.2)
		{
			AISetLookPos(hostage, GetThingPos(activator));	// Move to and look at the activator.
			AISetMovePos(hostage, GetThingPos(activator));
		}
		else
		{
			AIClearMode(hostage, 0x1);
			StopThing(hostage);
		}
	}

	if(dead) SetPulse(0);

Return;
#------------------------------------------------------------------------------
activated:
	// Only let this message run on the activating player's machine.
	if(jkGetLocalPlayer() != GetSourceRef() || dead) Return;

	if(isRescued)
	{
		SendTrigger(-1, 804, 0, 0, 0, 0);
		Return;
	}
	activator=GetSourceRef();

	if(!isMobile)	// Player activates the immobilized actor.
	{
		isMobile=1;
		if(isReleased) SendTrigger(-1, 807, 0, 0, 0, 0);				// Assume the actor has been paused.
		else													// Assume the actor was just released.
		{
			isReleased=1;
			SendTrigger(-1, 805, activator, 0, 0, 0);
		}
	}
	else		// Player activates the moveable actor...
	{
		isMobile=0;
		SendTrigger(-1, 806, activator, 0, 0, 0);
	}

	SendTrigger(-1, 802, isMobile, isReleased, activator, 0);

Return;
#------------------------------------------------------------------------------
killed:
	// Runs on all computers.
	SetPulse(0);
	killer=GetThingParent(GetSourceRef());
	jkStringClear();
	jkStringConcatAsciiString("-=HOSTAGE KILLED BY: ");
	jkStringConcatPlayerName(killer);
	jkStringConcatAsciiString("!=-");
	jkStringOutput();
	SendTrigger(-1, 803, GetThingHealth(hostage), killer, 0, 0);
	dead=1;

Return;
#------------------------------------------------------------------------------
rescue:
	// Runs on all computers
	isRescued=1;
	zdiff=VectorZ(GetSectorCenter(sectorRescue)) - VectorZ(GetThingPos(hostage));
	center=VectorAdd(GetSectorCenter(sectorRescue), VectorSet(-0.2, 0, -zdiff));
	AISetMovePos(hostage, center);
	AiSetLookPos(hostage, center);
	ChangeInv(jkGetLocalPlayer(), 152 , 500);
	Print("-=HOSTAGE RESCUED!=-");

Return;
#------------------------------------------------------------------------------
trigger:
	// All players but the one who sent the trigger run this code.
	if(GetSenderRef() == jkGetLocalPlayer() && GetSourceRef() < 804 || dead) Return;

	if(GetSourceRef() == 800) syncpos=VectorSet(GetParam(0), GetParam(1), GetParam(2));
	else if(GetSourceRef() == 801)
	{
		synclvec=VectorSet(GetParam(0), GetParam(1), GetParam(2));
		posghost=CreateThingAtPos(LoadTemplate("ghost"), GetParam(3), syncpos, '0 0 0');
		SetThingLook(posghost, synclvec);
		TeleportThing(hostage, posghost);
		DestroyThing(posghost);
	}
	else if(GetSourceRef() == 802)
	{
		isMobile=GetParam(0);
		isReleased=GetParam(1);
		activator=GetParam(2);
	}
	else if(GetSourceRef() == 803)
	{
		SetThingHealth(hostage, GetParam(0));
		if(GetThingHealth(hostage) < 1 && !dead)
		{
			PlayKey(hostage, LoadKeyframe("mndie.key"), 5, 0x14);
			dead=1;
			jkStringClear();
			jkStringConcatAsciiString("-=HOSTAGE KILLED BY: ");
			jkStringConcatPlayerName(GetParam(1));
			jkStringConcatAsciiString("!=-");
			jkStringOutput();
		}
	}
	else if(GetSourceRef() == 804)
	{
		jkStringClear();
		jkStringConcatAsciiString("Marty says: 'Thanks a lot, ");
		jkStringConcatPlayerName(activator);
		jkStringConcatAsciiString("!'");
		jkStringOutput();
	}
	else if(GetSourceRef() == 805)
	{
		jkStringClear();
		jkStringConcatAsciiString("Marty says: 'Ok, ");
		jkStringConcatPlayerName(GetParam(0));
		jkStringConcatAsciiString(". I'm right behind you!'");
		jkStringOutput();
	}
	else if(GetSourceRef() == 806)
	{
		jkStringClear();
		if(GetParam(0) == jkGetLocalPlayer()) jkStringConcatAsciiString("You say");
		else
		{
			jkStringConcatPlayerName(GetParam(0));
			jkStringConcatAsciiString(" says");
		}
		jkStringConcatAsciiString(": 'Stay there.'");		
		jkStringOutput();
	}
	else if(GetSourceRef() == 807)
	{
		jkStringClear();
		jkStringConcatAsciiString("Marty says: 'I'm ready to go.'");
		jkStringOutput();
	}

Return;
#------------------------------------------------------------------------------
touched:
	// Runs on all computers. Player pos will not be the same on all comps and the host will most likely foul this up a bit.
	toucher=GetSourceRef();
	if(GetThingType(toucher) != 10 || !isReleased || IsRescued || dead) Return;
	lvec=VectorSub(GetThingPos(toucher), GetThingPos(hostage));
	ApplyForce(hostage, VectorScale(VectorNorm(lvec), -2));

Return;
#------------------------------------------------------------------------------
join:
	// Only the host runs this code when a player joins. This code syncs the hostage.
	if(!IsServer() || dead) Return;
	curpos=GetThingPos(hostage);
	curlvec=GetThingLVec(hostage);
	SendTrigger(-1, 800, VectorX(curpos), VectorY(curpos), VectorZ(curpos), 0);
	SendTrigger(-1, 801, VectorX(curlvec), VectorY(curlvec), VectorZ(curlvec), GetThingSector(hostage));
	SendTrigger(-1, 802, isMobile, isReleased, activator, 0);
	SendTrigger(-1, 803, GetThingHealth(hostage), 0, 0, 0);

Return;
#------------------------------------------------------------------------------
end


There you go. [http://forums.massassi.net/html/wink.gif]


[This message has been edited by SaberMaster (edited January 15, 2002).]
Author of the JK DataMaster, Parsec, Scribe, and the EditPlus Cog Files.
2002-01-15, 1:09 PM #15
Whoa, thank you very much!!!

How would you like to appear? in the readme? Or in another way like a member?

hmm, I was testing it and for some reason it creates 2 hostages. I tried playing with the cog but got no where. Any ideas why?

[This message has been edited by Hellcat (edited January 15, 2002).]
Team Battle.
2002-01-16, 5:27 AM #16
Yeah, I know why that happens. The cog is being loaded twice and each cog is running on
its own. So they both create their own hostage. And I think the hostage doesn't
work because the cogs are ruining each other with their triggers.

Did you place this cog in the level with JED? The hostage template in the static.jkl
already has the cog assigned to it so you don't have to place it.

----
Several things:

I used the man1 template for the hostage and his key death key, mndie.key, is played when
trigger 803 is received. So if you use a different actor, be sure to put the correct
death key inside the LoadKeyframe() verb. You can find out which death key an actor uses by
looking in his .pup file.

The hostage's pos, lvec, and health are synced every 1/2 a second (5 pulses). Even
so, clients may see the hostage jump around as he teleports to the correct position.
Syncing more often will look better, but it may lag the game. It's a tradeoff.

Make sure that you take the FLEE instinct out of the hostage's ai file. Fleeing is random
and will be different on all computers.
-----

The Readme credits will be fine. [http://forums.massassi.net/html/biggrin.gif]


------------------
More matter with less art.

[This message has been edited by SaberMaster (edited January 16, 2002).]
Author of the JK DataMaster, Parsec, Scribe, and the EditPlus Cog Files.
2002-01-16, 12:57 PM #17
I've got it all to work fine except the double loading hostages. Which does some crazy stuff =D

I will fix up the flee thingy. Thanks!

Thanks very very much.

Is there a way of preventing the cog from being run twice?

[This message has been edited by Hellcat (edited January 16, 2002).]
Team Battle.
2002-01-17, 2:21 AM #18
Quote:
<font face="Verdana, Arial" size="2">Originally posted by Dormouse:
i don't remember where the 0x400 came from , i think it was from milenium thuogh.</font>


I know where it comes from. Millenium, Custom Projectiles Tutorial. In the text online there's correctly 0x240 but if you download the tutorial in the COG attached to it there's 0x404... I had trouble trying to understand which one was the correct one...

------------------
"May the SourceCode be with you..."
Nemios, MOD developer.
"May the SourceCode be with you..."
Nemios, MOD developer.
2002-01-17, 3:50 AM #19
Quote:
<font face="Verdana, Arial" size="2">Is there a way of preventing the cog from being run twice?</font>


It's not normal for a cog to be loaded twice. To fix this, find where you listed the cog. It's probably listed in both the static.jkl and the level's jkl(placed with JED). The items.dat can also load cogs, but it shouldn't be listed in there.

So remove the cog from the level and that should fix it. [http://forums.massassi.net/html/wink.gif]

------------------
More matter with less art.
Author of the JK DataMaster, Parsec, Scribe, and the EditPlus Cog Files.
2002-01-17, 12:42 PM #20
Ahh, thanks =)
Team Battle.

↑ Up to the top!