hi perr

perrinoia
Site Admin
Posts: 3732
Joined: Sun Jul 01, 2012 7:18 pm

Re: hi perr

Post by perrinoia »

You do not have to rewrite the base GroupTrigger events.

Code: Select all

	instant Trigger "GroupTrigger" {
		dataBlock = "GroupTrigger";
		name = "CaptureTrigger";	// "function <name>::onEnter(%this, %object)", "function <name>::onTrigger(%this, %object)", "function <name>::onLeave(%this, %object)"
		position = "0 0 20";
		rotation = "0 0 0";
		boundingBox = "-1 -1 -1 1 1 1";
		isSphere = "False";
	};
};
//--- export object end ---//
$teamScoreLimit = 12;
exec(objectives);
$Game::missionType = "CTF";
$cdTrack = 2;
$cdPlayMode = 1;

function CaptureTrigger::onEnter(%this, %object)
{
	messageAll(0, "CaptureTrigger works!");
}
What is the purpose of this trigger, by the way?

It almost looks like you are trying to code Battlefield 2 style base capturing. Am I right?

If this is the case... You should use onTrigger, instead of onEnter.

onEnter is called once, when you enter the box.
onTrigger is called approximately 3 times per second, while you are in the box.
onLeave is never called, and I've tried several things to remedy this, such as incrementing a variable in onTrigger, and then evaluating the onLeave event if decrementing the same variable half a second later makes it equal to zero. It works, but can be thwarted by lag.

If you are attempting to implement BF2 style base capturing, I recommend using a variable that contains the trigger's object id and the player's team...

For instance:

Code: Select all

function CaptureTrigger::onTrigger(%this, %object)
{
	%max = getNumTeams();
	%team = GameBase::getTeam(%object);
	schedule(sprintf("if($pwns[%1, %3]-- < "@ $pwns[%this, %team]++ @") CaptureTrigger::onLeave(%1, %2);", %this, %object, %team), 0.5);	// ++ now, -- later. Interval must be greater than 1/3 seconds.
	for(%i = 0; %i < %max; %i++)
		%pwnt += ($pwns[%this, %i] < $pwns[%this, %team]);	// count the teams that have less pwnage.
	if(%pwnt == %max - 1)	// if all others are pwnt, declare a winner!
	{
		echo($Server::teamName[%team] @" pwns "@ %this @".");
	}
}
Image
perrinoia
Site Admin
Posts: 3732
Joined: Sun Jul 01, 2012 7:18 pm

Re: hi perr

Post by perrinoia »

OK, both the function I previously wrote and the one you previously wrote are crap...

Let's start over.

I put this code in my mission file:

Code: Select all

function CaptureTrigger::onEnter(%this, %object)
{
	messageAll(0, "CaptureTrigger::onEnter("@ %this @", "@ %object @");");
}

function CaptureTrigger::onTrigger(%this, %object)
{
	messageAll(0, "CaptureTrigger::onTrigger("@ %this @", "@ %object @");");
}

function CaptureTrigger::onLeave(%this, %object)
{
	messageAll(0, "CaptureTrigger::onLeave("@ %this @", "@ %object @");");
}
I named a trigger "CaptureTrigger" and then walked through it and this is what I see.
CaptureTrigger.png
CaptureTrigger.png (9.17 KiB) Viewed 3474 times
Does that make sense?

8408 = Trigger
8415 = Player
Image
perrinoia
Site Admin
Posts: 3732
Joined: Sun Jul 01, 2012 7:18 pm

Re: hi perr

Post by perrinoia »

Code: Select all

function capture::post(%this, %player)

schedule("Capturing::Post("@ %this @", "@ %player @");", 0.01);
Don't forget to spell your function and command the same way, though... One says capture, the other says capturing.
Image
perrinoia
Site Admin
Posts: 3732
Joined: Sun Jul 01, 2012 7:18 pm

Re: hi perr

Post by perrinoia »

Ps: why is it scheduled?

Why not just write capture::post(%this, %player);
Image
perrinoia
Site Admin
Posts: 3732
Joined: Sun Jul 01, 2012 7:18 pm

Re: hi perr

Post by perrinoia »

Wait, is this team based, or free for all?
Image
perrinoia
Site Admin
Posts: 3732
Joined: Sun Jul 01, 2012 7:18 pm

Re: hi perr

Post by perrinoia »

Code: Select all

Group::iterateRecursive(getGroup(%this), Gamebase::setTeam, Gamebase::getTeam(%object));
This will set the team of everything in the trigger's group and sub-groups to match the team of the object that triggered the trigger.

Changing the color of the laser is more difficult. You'll need a different color laser for each team. You'll need to delete the old laser and spawn a new one, each time.
Image
perrinoia
Site Admin
Posts: 3732
Joined: Sun Jul 01, 2012 7:18 pm

Re: hi perr

Post by perrinoia »

Wut?

You don't need to replace the switch. It's emblems reflect the team it belongs to.
You do needed to replace the laser, but it sounds like you've got that covered.

As for the description variable, no... I don't think so...

But you can use Object::getName(%this) to get the object name (not to be confused with the name of the object, lol), which you could call "Zone A", if you wish.

Code: Select all

 instant trigger "Zone A" {
    name = "CapturePost";
    Etc...
}
Or you could get the group's name:

Code: Select all

 instant SIMgroup "Zone A" {
    Instant trigger "anything" {
        Name = "CapturePost";
        Etc...
    }
}
Image
perrinoia
Site Admin
Posts: 3732
Joined: Sun Jul 01, 2012 7:18 pm

Re: hi perr

Post by perrinoia »

Well, first of all, you should use onInit instead of onAdd, unless your switch is not part of the mission.

In that function, you should create a generic laser, and store it's object ID in a global variable (use $ instead of %, or store it as a property of the switch, example %this.laserID = projectile::spawnprojectile, blah blah blah).

Then, in your capture post function, you should delete the old laser and spawn a new one.
Image
perrinoia
Site Admin
Posts: 3732
Joined: Sun Jul 01, 2012 7:18 pm

Re: hi perr

Post by perrinoia »

Need to work on spawning lasers, triggers, or players?
Image
perrinoia
Site Admin
Posts: 3732
Joined: Sun Jul 01, 2012 7:18 pm

Re: hi perr

Post by perrinoia »

The last function was copy and pasted from Annihilation mod. I commented out two lines and added two more to that function.
The first 4 functions, however, are completely rewritten for your purposes.

Code: Select all

// Adds this to set if no obstructions are nearby.
function DropPointMarker::pickRandomSpawn(%this, %set)
{
	%tmp = newObject("Obstructions", SimSet);
	if(!containerBoxFillSet(%tmp, $SimPlayerObjectType | $MineObjectType | $StaticObjectType, GameBase::getPosition(%this), 2, 2, 2, 0))
		addToSet(%set, %this);
	deleteObject(%tmp);
}

// If the tower switch is on the right team, runs DropPointMarker::pickRandomSpawn for each DropPointMarker in the TowerSwitch's group.
function TowerSwitch::getSpawns(%this, %team, %set)
{
	if(GameBase::getTeam(%this) == %team)
		Group::iterateRecursive(getGroup(%this), GameBase::virtual, "pickRandomSpawn", %set);
}

// Runs TowerSwitch::getSpawns for every TowerSwitch in the mission.
function Game::pickRandomSpawn(%team)
{
	%tmp = newObject("Random", SimSet);
	Group::iterateRecursive(MissionGroup, GameBase::virtual, "getSpawns", %team, %tmp);
	return Group::getObject(%tmp, floor(getRandom() * Group::objectCount(%tmp)));
	deleteObject(%tmp);
}

// Modified to prevent picking a random spawn when there are no start spawns.
function Game::pickTeamSpawn(%team, %respawn)
{
	return getWord(Game::pickStartSpawn(%team) @" "@ Game::pickRandomSpawn(%team), %respawn);
}

// Modified to prevent spawning when no valid spawn points are found.
function Game::playerSpawn(%clientId, %respawn)
{
	if(!$ghosting)
		return false;
	
	Client::clearItemShopping(%clientId);
	%spawnMarker = Game::pickPlayerSpawn(%clientId, %respawn);
	
	%clientId.guiLock = "";
	%clientId.dead = "";
	if(%spawnMarker == -1)
	{
// 		%spawnPos = "0 0 300";
// 		%spawnRot = "0 0 0";
		BottomPrint(%clientId, "<jc>No available spawn points.\nTry again later.", 2);
		return;
	}
	else
	{
		%spawnPos = GameBase::getPosition(%spawnMarker);
		// make sure the player doesnt end up with goofy rotation and screw up deploying items.. -plasmatic
		%spawnRot = "0 0 "@ getword(GameBase::getRotation(%spawnMarker),2);
	}
	//plasmatic 3.0
	if($build)
	{
		$DefaultArmor[Male] = armormBuilder;
		$DefaultArmor[Female] = armorfBuilder;	
	}
	else
	{
		$DefaultArmor[Male] = armormWarrior;
		$DefaultArmor[Female] = armorfWarrior;			
	}
	%armor = $DefaultArmor[Client::getGender(%clientId)];
	
	%pl = spawnPlayer(%armor, %spawnPos, %spawnRot);
	echo("SPAWN: "@ Client::getName(%clientID)@ " cl:" @ %clientId @ " pl:" @ %pl @ " marker:" @ %spawnMarker @ " armor:" @ %armor @" rot: "@gamebase::getrotation(%pl));
	%pl.cloakable = true;	//for base cloaker -plasmatic
	
	%clientId.observerMode = "";
	%pl.teled = "";	// for teleporter 2.2 model -plasmatic
	%clientId.ConnectBeam = "";	//for zappy invs -plasmatic
	%clientId.InvTargetable = "";	//zap!
	%ClientId.InvConnect = "";	//Zap!
	
	if(%pl != -1)
	{
		//Client::clearItemShopping(%clientId);
		GameBase::setTeam(%pl, Client::getTeam(%clientId));
		Client::setOwnedObject(%clientId, %pl);
		Game::playerSpawned(%pl, %clientId, %armor, %respawn);
		%pl.cloakable = true;
		$jailed[%pl] = "";
		$released[%pl] = "";
		if($matchStarted)
		{
			Client::setControlObject(%clientId, %pl);
			%clientId.droid=false;
		}
		else
		{
			%clientId.observerMode = "pregame";
			Client::setControlObject(%clientId, Client::getObserverCamera(%clientId));
			Observer::setOrbitObject(%clientId, %pl, 3, 3, 3);
		}
		//==================  respawn Invulnerable -plasmatic
		$respawnInvulnerableTime = 10;
		if(%respawn)	
		{
			$respawnInvulnerableTime = 5;
			if($siegeFlag)	Siege::waypointClient(%clientId);
		}
		%damage = %armor.maxDamage - 0.001;
		GameBase::setEnergy(%pl, %armor.maxEnergy);	///2);
		GameBase::setAutoRepairRate(%pl, %damage / $respawnInvulnerableTime);
		%pl.invulnerable = true;
		%pl.cloakable = true;	//fer base cloaker -plasmatic
		$jailed[%pl] = "";	//just to be certain for jail..
		$released[%pl] = "";
		
		incInvulnerable(%pl, 0);
		%weapon = Player::getMountedItem(%pl,$WeaponSlot);
		if(%weapon != -1) 
		{
			%pl.lastWeapon = %weapon;
			Player::unMountItem(%pl,$WeaponSlot);
		}
		if(!%respawn)
		{
			// initial drop
			if($siegeFlag)
			{
				schedule("Client::sendMessage("@%clientId@", 0, \"Welcome to Siege! Capture or hold the switch to complete the mission.\");",5);
				schedule("Siege::InitialwaypointClient("@%clientId@");",5);
			}
// 			if(%clientId.SpecialMessage == true)
// 				CustomMessage(%clientId);
// 			ModSettingsInfo(%clientId, true);
			//echo("join team "@Client::getTeam(%clientId)@" old team = "@%clientId.lastteam);
			if(%clientId.LastTeam != -1 && %clientId.LastTeam != Client::getTeam(%clientId))
			{
				if($annihilation::DisableTurretsOnTeamChange)
				Turret::DisableClients(%clientId);	
			}
			
			%clientId.LastTeam = Client::getTeam(%clientId);
		}  
		
	}
	return true;
}
Image
Post Reply