[Info] Shoutcast scripts?

User avatar
Fixious
Posts: 475
Joined: Sat Nov 09, 2013 12:42 am

Re: [Info] Shoutcast scripts?

Post by Fixious »

Can't get this to work for some reason. Added shoutcast.cs to config/Core. Binds are located in the Inventory tab - Obs Team 1, Obs Team 2, Obs Player. Set binds up, but nothing seems to happen on obs.
User avatar
Fixious
Posts: 475
Joined: Sat Nov 09, 2013 12:42 am

Re: [Info] Shoutcast scripts?

Post by Fixious »

Looks like this worked for the most part for phr33ky. It'd be nice if one team had red iffs and the other had green, to differentiate between them, but that probably requires a bit more work.
User avatar
DaJ4ck3L
Crow{OZ}
Posts: 3375
Joined: Thu Jul 22, 2010 11:51 pm
Contact:

Re: [Info] Shoutcast scripts?

Post by DaJ4ck3L »

yea i was thinking that too. probably doable. i think there is an option to free roam in anni while still having colors for the teams. ill have to reference that and see what i can do there. i made this script using base mod as a reference.

i would really love to also get a better drop point position on the flag, instead of positioning the camera above it, id rather the camera be facing it. any ideas on that perr?

edit: just tested the first thing in anni, and sadly it turns all players red when you hit that mode. it looks like the only way to get team ind is by orbiting the player. ill test a few other methods.
Image
User avatar
DaJ4ck3L
Crow{OZ}
Posts: 3375
Joined: Thu Jul 22, 2010 11:51 pm
Contact:

Re: [Info] Shoutcast scripts?

Post by DaJ4ck3L »

Code: Select all

$Camera::movementSpeed = 40;

datablock CameraData(Observer)
{
   mode = "observerStatic";
   firstPersonOnly = true;
};

datablock CameraData(CommanderCamera)
{
   mode = "observerStatic";
   firstPersonOnly = true;
};

function CommanderCamera::onTrigger( %data, %obj, %trigger, %state )
{
   // no need to do anything here.
}

function Observer::onTrigger(%data,%obj,%trigger,%state)
{
   // state = 0 means that a trigger key was released
   if (%state == 0)
      return;

   //first, give the game the opportunity to prevent the observer action
   if (!Game.ObserverOnTrigger(%data, %obj, %trigger, %state))
      return;

   //now observer functions if you press the "throw"
   if (%trigger >= 4)
      return;

   //trigger types:   0:fire 1:altTrigger 2:jump 3:jet 4:throw
   %client = %obj.getControllingClient();
   if (%client == 0)
      return;

   switch$ (%obj.mode)
   {
      case "justJoined":
         if ( isDemoServer() )
            clearCenterPrint( %client );
            
         //press FIRE
         if (%trigger == 0)
         {
            // clear intro message
            clearBottomPrint( %client );
            
            //spawn the player
			   commandToClient(%client, 'setHudMode', 'Standard');
            Game.assignClientTeam(%client);
            Game.spawnPlayer( %client, $MatchStarted );
            
            if( $MatchStarted )
            {
               %client.camera.setFlyMode();
               %client.setControlObject( %client.player );
            }
            else
            {   
               %client.camera.getDataBlock().setMode( %client.camera, "pre-game", %client.player );
               %client.setControlObject( %client.camera );
            }
         }
         
         //press JET
         else if (%trigger == 3)
         {
            //cycle throw the static observer spawn points
            %markerObj = Game.pickObserverSpawn(%client, true);
            %transform = %markerObj.getTransform();
            %obj.setTransform(%transform);
            %obj.setFlyMode();
         }

         //press JUMP
         else if (%trigger == 2)
         {
            //switch the observer mode to observing clients
            if (isObject(%client.observeFlyClient))
               serverCmdObserveClient(%client, %client.observeFlyClient);
            else
               serverCmdObserveClient(%client, -1);

            displayObserverHud(%client, %client.observeClient);
            messageClient(%client.observeClient, 'Observer', '\c1%1 is now observing you.', %client.name);  
         }
      
      case "playerDeath":
         // Attached to a dead player - spawn regardless of trigger type
         if(!%client.waitRespawn && getSimTime() > %client.suicideRespawnTime)
         {
			   commandToClient(%client, 'setHudMode', 'Standard');
            Game.spawnPlayer( %client, true );
            %client.camera.setFlyMode();
            %client.setControlObject(%client.player);
         }
      
      case "PreviewMode":
         if (%trigger == 0)
         {
			   commandToClient(%client, 'setHudMode', 'Standard');
            if( %client.lastTeam )
               Game.clientJoinTeam( %client, %client.lastTeam );
            else
            {   
               Game.assignClientTeam( %client, true );
               
               // Spawn the player:
               Game.spawnPlayer( %client, false );
            }
            
            %client.camera.setFlyMode();
            %client.setControlObject( %client.player );
         }

      case "toggleCameraFly":
      // this is the default camera mode

      case "observerFly":
         // Free-flying observer camera
         
         if (%trigger == 0)
         {
            if( !$Host::TournamentMode && $MatchStarted )
            {
               // reset observer params
               clearBottomPrint(%client);
				   commandToClient(%client, 'setHudMode', 'Standard');
               
               if( %client.lastTeam !$= "" && %client.lastTeam != 0 && Game.numTeams > 1)
               {   
                  Game.clientJoinTeam( %client, %client.lastTeam, $MatchStarted ); 
                  %client.camera.setFlyMode();
                  %client.setControlObject( %client.player );
               }
               else
               {   
                  
                  Game.assignClientTeam( %client );
                  
                  // Spawn the player:
                  Game.spawnPlayer( %client, true );
                  %client.camera.setFlyMode();
                  %client.setControlObject( %client.player );
                  ClearBottomPrint( %client );
               }
            }
            else if( !$Host::TournamentMode )
            {
               
               clearBottomPrint(%client);
               Game.assignClientTeam( %client );
                  
               // Spawn the player:
               Game.spawnPlayer( %client, false );
               %client.camera.getDataBlock().setMode( %client.camera, "pre-game", %client.player );
               %client.setControlObject( %client.camera );
            }
         }   
         //press JET
         else if (%trigger == 3)
         {
            %markerObj = Game.pickObserverSpawn(%client, true);
            %transform = %markerObj.getTransform();
            %obj.setTransform(%transform);
            %obj.setFlyMode();
         }

         //press JUMP
         else if (%trigger == 2)
         {
            //switch the observer mode to observing clients
            if (isObject(%client.observeFlyClient))
               serverCmdObserveClient(%client, %client.observeFlyClient);
            else
               serverCmdObserveClient(%client, -1);
            
            observerFollowUpdate( %client, %client.observeClient, false );
            displayObserverHud(%client, %client.observeClient);
            messageClient(%client.observeClient, 'Observer', '\c1%1 is now observing you.', %client.name);  
         }
      
      case "observerStatic":
         // Non-moving observer camera
         %next = (%trigger == 3 ? true : false);
         %markerObj = Game.pickObserverSpawn(%client, %next);
         %transform = %markerObj.getTransform();
         %obj.setTransform(%transform);
         %obj.setFlyMode();
      
      case "observerTimeout":
         // Player didn't respawn quickly enough
         if (%trigger == 0)
         {
            clearBottomPrint(%client);
			   commandToClient(%client, 'setHudMode', 'Standard');
            if( %client.lastTeam )
               Game.clientJoinTeam( %client, %client.lastTeam, true ); 
            else
            {   
               Game.assignClientTeam( %client );
               
               // Spawn the player:
               Game.spawnPlayer( %client, true );
            }
            
            %client.camera.setFlyMode();
            %client.setControlObject( %client.player );
         }   

         //press JET
         else if (%trigger == 3)
         {
            %markerObj = Game.pickObserverSpawn(%client, true);
            %transform = %markerObj.getTransform();
            %obj.setTransform(%transform);
            %obj.setFlyMode();
         }

         //press JUMP
         else if (%trigger == 2)
         {
            //switch the observer mode to observing clients
            if (isObject(%client.observeFlyClient))
               serverCmdObserveClient(%client, %client.observeFlyClient);
            else
               serverCmdObserveClient(%client, -1);
            
            // update the observer list for this client
            observerFollowUpdate( %client, %client.observeClient, false );
            
            displayObserverHud(%client, %client.observeClient);
            messageClient(%client.observeClient, 'Observer', '\c1%1 is now observing you.', %client.name);  
         }

      case "observerFollow":
         // Observer attached to a moving object (assume player for now...)
         //press FIRE - cycle to next client
         if (%trigger == 0)
         {
            %nextClient = findNextObserveClient(%client);
            %prevObsClient = %client.observeClient;
            if (%nextClient > 0 && %nextClient != %client.observeClient)
            {
               // update the observer list for this client
               observerFollowUpdate( %client, %nextClient, true );
               
               //set the new object
               %transform = %nextClient.player.getTransform();
               if( !%nextClient.isMounted() )
               {
                  %obj.setOrbitMode(%nextClient.player, %transform, 0.5, 4.5, 4.5);
                  %client.observeClient = %nextClient;
               }
               else
               {
                  %mount = %nextClient.player.getObjectMount();
                  if( %mount.getDataBlock().observeParameters $= "" )
                     %params = %transform;
                  else
                     %params = %mount.getDataBlock().observeParameters;
            
                  %obj.setOrbitMode(%mount, %mount.getTransform(), getWord( %params, 0 ), getWord( %params, 1 ), getWord( %params, 2 ));
                  %client.observeClient = %nextClient;
               }
               
               //send the message(s)
               displayObserverHud(%client, %nextClient);
               messageClient(%nextClient, 'Observer', '\c1%1 is now observing you.', %client.name);  
               messageClient(%prevObsClient, 'ObserverEnd', '\c1%1 is no longer observing you.', %client.name);  
            }
         }

         //press JET - cycle to prev client
         else if (%trigger == 3)
         {
            %prevClient = findPrevObserveClient(%client);
            %prevObsClient = %client.observeClient;
            if (%prevClient > 0 && %prevClient != %client.observeClient)
            {
               // update the observer list for this client
               observerFollowUpdate( %client, %prevClient, true );
               
               //set the new object
               %transform = %prevClient.player.getTransform();
               if( !%prevClient.isMounted() )
               {
                  %obj.setOrbitMode(%prevClient.player, %transform, 0.5, 4.5, 4.5);
                  %client.observeClient = %prevClient;
               }
               else
               {
                  %mount = %prevClient.player.getObjectMount();
                  if( %mount.getDataBlock().observeParameters $= "" )
                     %params = %transform;
                  else
                     %params = %mount.getDataBlock().observeParameters;
            
                  %obj.setOrbitMode(%mount, %mount.getTransform(), getWord( %params, 0 ), getWord( %params, 1 ), getWord( %params, 2 ));
                  %client.observeClient = %prevClient;
               }

               //send the message(s)
               displayObserverHud(%client, %prevClient);
               messageClient(%prevClient, 'Observer', '\c1%1 is now observing you.', %client.name);  
               messageClient(%prevObsClient, 'ObserverEnd', '\c1%1 is no longer observing you.', %client.name);  
            }
         }

         //press JUMP
         else if (%trigger == 2)
         {
            // update the observer list for this client
            observerFollowUpdate( %client, -1, false );
            
            //toggle back to observer fly mode
            %obj.mode = "observerFly";
            %obj.setFlyMode();
            updateObserverFlyHud(%client);
            messageClient(%client.observeClient, 'ObserverEnd', '\c1%1 is no longer observing you.', %client.name);  
         } 
      
      case "pre-game":
         if(!$Host::TournamentMode || $CountdownStarted)
            return;

         if(%client.notReady)
         {
            %client.notReady = "";
            MessageAll( 0, '\c1%1 is READY.', %client.name );
            if(%client.notReadyCount < 3)
               centerprint( %client, "\nWaiting for match start (FIRE if not ready)", 0, 3);
            else 
               centerprint( %client, "\nWaiting for match start", 0, 3);
         }
         else
         {
            %client.notReadyCount++;
            if(%client.notReadyCount < 4)
            {
               %client.notReady = true;
               MessageAll( 0, '\c1%1 is not READY.', %client.name );
               centerprint( %client, "\nPress FIRE when ready.", 0, 3 );
            }
            return;
         }
         CheckTourneyMatchStart();
   }
}

function Observer::setMode(%data, %obj, %mode, %targetObj)
{
   if(%mode $= "")
      return;   
   %client = %obj.getControllingClient();
   switch$ (%mode) {
      case "justJoined":
		   commandToClient(%client, 'setHudMode', 'Observer');
         %markerObj = Game.pickObserverSpawn(%client, true);
         %transform = %markerObj.getTransform();
         %obj.setTransform(%transform);
         %obj.setFlyMode();
      
      case "pre-game":
		   commandToClient(%client, 'setHudMode', 'Observer');
         %obj.setOrbitMode( %targetObj, %targetObj.getTransform(), 0.5, 4.5, 4.5);
      
      case "observerFly":
         // Free-flying observer camera
		   commandToClient(%client, 'setHudMode', 'Observer');
         %markerObj = Game.pickObserverSpawn(%client, true);
         %transform = %markerObj.getTransform();
         %obj.setTransform(%transform);
         %obj.setFlyMode();
      
      case "observerStatic":
         // Non-moving observer camera
         %markerObj = Game.pickObserverSpawn(%client, true);
         %transform = %markerObj.getTransform();
         %obj.setTransform(%transform);
      
      case "observerFollow":
         // Observer attached to a moving object (assume player for now...)
         %transform = %targetObj.getTransform();
         
         if( !%targetObj.isMounted() )
            %obj.setOrbitMode(%targetObj, %transform, 0.5, 4.5, 4.5);
         else
         {
            %mount = %targetObj.getObjectMount();
            if( %mount.getDataBlock().observeParameters $= "" )
               %params = %transform;
            else
               %params = %mount.getDataBlock().observeParameters;
            
            %obj.setOrbitMode(%mount, %mount.getTransform(), getWord( %params, 0 ), getWord( %params, 1 ), getWord( %params, 2 ));
         }
      
      case "observerTimeout":
		   commandToClient(%client, 'setHudMode', 'Observer');
         %markerObj = Game.pickObserverSpawn(%client, true);
         %transform = %markerObj.getTransform();
         %obj.setTransform(%transform);
         %obj.setFlyMode();
   }
   %obj.mode = %mode;   
}

function findNextObserveClient(%client)
{
   %index = -1;
   %count = ClientGroup.getCount();
   if (%count <= 1)
      return -1;

   for (%i = 0; %i < %count; %i++)
   {
      %cl = ClientGroup.getObject(%i);
      if (%cl == %client.observeClient)
      {
         %index = %i;
         break;
      }
   }

   //now find the next client (note, if not found, %index still == -1)
   %index++;
   if (%index >= %count)
      %index = 0;

   %newClient = -1;
   for (%i = %index; %i < %count; %i++)
   {
      %cl = ClientGroup.getObject(%i);
      if (%cl != %client && %cl.player > 0)
      {
         %newClient = %cl;
         break;
      }
   }

   //if we didn't find anyone, search from the beginning again
   if (%newClient < 0)
   {
      for (%i = 0; %i < %count; %i++)
      {
         %cl = ClientGroup.getObject(%i);
         if (%cl != %client && %cl.player > 0)
         {
            %newClient = %cl;
            break;
         }
      }
   }

   //if we still haven't found anyone (new), give up..
   if (%newClient < 0 || %newClient.player == %player)
      return -1;
}

function findPrevObserveClient(%client)
{
   %index = -1;
   %count = ClientGroup.getCount();
   if (%count <= 1)
      return -1;

   for (%i = 0; %i < %count; %i++)
   {
      %cl = ClientGroup.getObject(%i);
      if (%cl == %client.observeClient)
      {
         %index = %i;
         break;
      }
   }

   //now find the prev client
   %index--;
   if (%index < 0)
      %index = %count - 1;

   %newClient = -1;
   for (%i = %index; %i >= 0; %i--)
   {
      %cl = ClientGroup.getObject(%i);
      if (%cl != %client && %cl.player > 0)
      {
         %newClient = %cl;
         break;
      }
   }

   //if we didn't find anyone, search from the end again
   if (%newClient < 0)
   {
      for (%i = %count - 1; %i >= 0; %i--)
      {
         %cl = ClientGroup.getObject(%i);
         if (%cl != %client && %cl.player > 0)
         {
            %newClient = %cl;
            break;
         }
      }
   }

   //if we still haven't found anyone (new), give up..
   if (%newClient < 0 || %newClient.player == %player)
      return -1;
}

function observeClient(%client)
{
   if( $testcheats )
   {
      //pass in -1 to choose any client...
      commandToServer('observeClient', %client);
   }
}

function serverCmdObserveClient(%client, %target)
{
   //clear the observer fly mode var...
   %client.observeFlyClient = -1;

   //cancel any scheduled update
   cancel(%client.obsHudSchedule);

   // must be an observer when observing other clients
   if( %client.getControlObject() != %client.camera)
      return;
   
   //can't observer yourself
   if (%client == %target)
      return;

   %count = ClientGroup.getCount();

   //can't go into observer mode if you're the only client
   if (%count <= 1)
      return;

   //make sure the target actually exists
   if (%target > 0)
   {
      %found = false;
      for (%i = 0; %i < %count; %i++)
      {
          %cl = ClientGroup.getObject(%i);
          if (%cl == %target)
          {
            %found = true;
            break;
          }
      }

      if (!%found)
         return;
   }

   else 
   {
      %client.observeClient = -1;
      %target = findNextObserveClient(%client);
      if (%target <= 0)
         return;
   }

   //send the message
   if (%client.camera.mode !$= "observerFollow")
   {
      if (isObject(%client.player))
         %client.player.scriptKill(0);

      //messageAllExcept(%client, -1, 'ClientNowObserver', '\c1%1 is now an observer.', %client.name);
      //messageClient(%client, 'YouNowObserver', '\c1You are now observing %1.', %target.name);   
   }

   %client.camera.getDataBlock().setMode(%client.camera, "observerFollow", %target.player);
   %client.setControlObject(%client.camera);

   //tag is used if a client who is being observed dies...
   %client.observeClient = %target;
}

function observerFollowUpdate( %client, %nextClient, %cycle )
{
   %Oclient = %client.observeClient;
   if( %Oclient $= "" )
      return;
   
   // changed to observer fly...
   if( %nextClient == -1 )
   {
      // find us in their observer list and remove, then reshuffle the list...
      for( %i = 0; %i < %Oclient.observeCount; %i++ )
      {
         if( %Oclient.observers[%i] == %client )
         {
            %Oclient.observeCount--;
            %Oclient.observers[%i] = %Oclient.observers[%Oclient.observeCount];
            %Oclient.observers[%Oclient.observeCount] = "";
            break;
         }
      }
      return; // were done..
   }

   // changed from observer fly to observer follow...
   if( !%cycle && %nextClient != -1 )
   {
      // if nobody is observing this guy, initialize their observer count...
      if( %nextClient.observeCount $= "" )
         %nextClient.observeCount = 0;

      // add us to their list of observers...
      %nextClient.observers[%nextClient.observeCount] = %client;
      %nextClient.observeCount++;
      return; // were done.
   }

   if( %nextClient != -1 )
   {
      // cycling to the next client...
      for( %i = 0; %i < %Oclient.observeCount; %i++ )
      {
         // first remove us from our prev client's list...
         if( %Oclient.observers[%i] == %client )
         {
            %Oclient.observeCount--;
            %Oclient.observers[%i] = %Oclient.observers[%Oclient.observeCount];
            %Oclient.observers[%Oclient.observeCount] = "";
            break; // screw you guys, i'm goin home!
         }
      }

      // if nobody is observing this guy, initialize their observer count...
      if( %nextClient.observeCount $= "" )
         %nextClient.observeCount = 0;

      // now add us to the new clients list...
      %nextClient.observeCount++;
      %nextClient.observers[%nextClient.observeCount - 1] = %client;
   }
}

function updateObserverFlyHud(%client)
{
   //just in case there are two threads going...
   cancel(%client.obsHudSchedule);
   %client.observeFlyClient = -1;

   //make sure the client is supposed to be in observer fly mode...
   if (!isObject(%client) || %client.team != 0 || %client.getControlObject() != %client.camera || %client.camera.mode $= "observerFollow")
      return;

	//get various info about the player's eye
	%srcEyeTransform = %client.camera.getTransform();
	%srcEyePoint = firstWord(%srcEyeTransform) @ " " @ getWord(%srcEyeTransform, 1) @ " " @ getWord(%srcEyeTransform, 2);

	%srcEyeVector = MatrixMulVector("0 0 0 " @ getWords(%srcEyeTransform, 3, 6), "0 1 0");
	%srcEyeVector = VectorNormalize(%srcEyeVector);

   //see if there's an enemy near our defense location...
   %clientCount = 0;
   %count = ClientGroup.getCount();
   %viewedClient = -1;
   %clientDot = -1;
   for(%i = 0; %i < %count; %i++)
   {
		%cl = ClientGroup.getObject(%i);

		//make sure we find an AI who's alive and not the client
		if (%cl != %client && isObject(%cl.player))
		{
			//make sure the player is within range
		   %clPos = %cl.player.getWorldBoxCenter();
		   %distance = VectorDist(%clPos, %srcEyePoint);
			if (%distance <= 30)
			{
				//create the vector from the client to the client
				%clVector = VectorNormalize(VectorSub(%clPos, %srcEyePoint));

				//see if the dot product is greater than our current, and greater than 0.6
				%dot = VectorDot(%clVector, %srcEyeVector);

				if (%dot > 0.6 && %dot > %clientDot)
				{
					//make sure we're not looking through walls...
					%mask = $TypeMasks::TerrainObjectType | $TypeMasks::InteriorObjectType | $TypeMasks::StaticShapeObjectType;
					%losResult = containerRayCast(%srcEyePoint, %clPos, %mask);
					%losObject = GetWord(%losResult, 0);
					if (!isObject(%losObject))
					{
						%viewedClient = %cl;
						%clientDot = %dot;
					}
				}
			}
		}
   }

   if (isObject(%viewedClient))
      displayObserverHud(%client, 0, %viewedClient);
   else
      displayObserverHud(%client, 0);

   %client.observeFlyClient = %viewedClient;

   //schedule the next...
   %client.obsHudSchedule = schedule(500, %client, updateObserverFlyHud, %client);
}

this looks interesting, and it comes with camera data blocks. im wondering if you could create new camera data blocks in t1 to set team for observer fly mode.

what you think perr?

found this on a t2 site, but sure does look like a t1 script. wonder if some of this stuff can be used in t1.

http://spinfusor.ch/tribes2/mods/AirKil ... /camera.cs
Image
User avatar
DaJ4ck3L
Crow{OZ}
Posts: 3375
Joined: Thu Jul 22, 2010 11:51 pm
Contact:

Re: [Info] Shoutcast scripts?

Post by DaJ4ck3L »

argh!!!!! i need to figure out how to change damn obs team when in fly mode...

edit: so i ust tried Observer::setTeam(%clientId, %team); and it actually did change my team, and didn't give unknown function error. didn't work though. weird.
Image
User avatar
DaJ4ck3L
Crow{OZ}
Posts: 3375
Joined: Thu Jul 22, 2010 11:51 pm
Contact:

Re: [Info] Shoutcast scripts?

Post by DaJ4ck3L »

Client::setControlObject(%clientId, Client::getObserverCamera(%clientId));

wonder what can be done with this, and if maybe the answer lies here.

like what this Client::getObserverCamera(%clientId) do? can it be edited? can it be recreated? hmmmmm.

no reference on it in the scripting docs, and no source function. fuk.
Image
User avatar
Fixious
Posts: 475
Joined: Sat Nov 09, 2013 12:42 am

Re: [Info] Shoutcast scripts?

Post by Fixious »

Don't give up! There are a lot more things that could be done to make casting easier, but since you're already looking into this one, keep at it.
perrinoia
Site Admin
Posts: 3732
Joined: Sun Jul 01, 2012 7:18 pm

Re: [Info] Shoutcast scripts?

Post by perrinoia »

The problem with setting your observer cam rotation based on the flag rotation, is the flags turn...

Yes, you can set a non rotating flag with a specific rotation in the map, when editing, but when playing, a player picks up and throws the flag, it has a new rotation, even when it returns to base... Original position, new fucking rotation.

So, no matter what you do, observing a flag that is not currently being carried will always have a random rotation (except at the beginning of the match, before anyone touches the flag).
Image
User avatar
DaJ4ck3L
Crow{OZ}
Posts: 3375
Joined: Thu Jul 22, 2010 11:51 pm
Contact:

Re: [Info] Shoutcast scripts?

Post by DaJ4ck3L »

lol i noticed that, wondering if you could save the original rotation, and have it set that every match with variable when it's returned.. my biggest goal though is to get red / green ind in fly mode, but it's not quite working out.

and the issue i had with orbital flag is when a player picks it up, the camera would stick to that spot, and shows an invisible flag. easy fix, just have it swap to player when he picks up.
Image
perrinoia
Site Admin
Posts: 3732
Joined: Sun Jul 01, 2012 7:18 pm

Re: [Info] Shoutcast scripts?

Post by perrinoia »

Oh, you have em observe the flag, when it's on someone's back? That's interesting.
Image
Post Reply