OK I have just modified the turret's states a little bit and used a script to assign the target instead of SXF_TRANSFERPOINTERS and it works way better now.
DECORATE:
Code: Select all
ACTOR FT: inventory
{
Inventory.maxamount 1
}
ACTOR newplasma: PlasmaBall
{
Radius 2.5
Height 5
scale 0.4
Speed 40
Damage (5)
Projectile
Species "Turret"
DamageType "newPlasma"
+THRUSPECIES
}
ACTOR Turret
{
Health 100
Radius 4
painChance 0
Height 4
scale 1
Mass 0
Speed 0
Monster
Species "Turret"
+THRUSPECIES
+SPECTRAL
+NEVERTARGET
+Friendly
+NOGRAVITY
+FLOAT
+Ghost
+THRUGHOST
+THRUACTORS
-TELESTOMP
+Standstill
+NOTARGETSWITCH
States
{
Spawn:
TNT1 AAAAA 0 A_ClearTarget
TNT1 A 1
TNT1 A 1 ACS_EXECUTEalways(101,0,0,0,0)
see:
TNT1 A 0
Missile:
TNT1 A 1 A_FaceTarget
TNT1 A 1 A_JumpIfTargetInLOS("HEIS",180,JLOSF_DEADNOJUMP|JLOSF_COMBATANTONLY)
Goto Death
HEIS:
TNT1 F 6 A_customMissile("newplasma")
Goto Missile
Death:
TNT1 A 0 ACS_EXECUTEalways(103,0,0,0,0)
TNT1 A 1
TNT1 A -1
Stop
}
}
ACTOR ShoulderPuff
{
+PUFFONACTORS
+ALWAYSPUFF
+PUFFGETSOWNER
+HITTRACER
+THRUGHOST
States
{
Spawn:
TNT1 AAAAA 0
TNT1 A 0 A_TransferPointer(AAPTR_DEFAULT, AAPTR_TARGET, AAPTR_TRACER, AAPTR_TARGET)
stop
}
}
ACTOR BeamTester : DoomWeapon
{
Weapon.SelectionOrder 100
Weapon.slotNumber 6
+NOAUTOAIM
States
{
Ready:
PLSG A 5 A_WeaponReady
Loop
Deselect:
PLSG A 1 A_Lower
Loop
Select:
PLSG A 1 A_Raise
Loop
Fire:
PLSG A 0 A_FireBullets(0, 0, 1, 0, "ShoulderPuff")
PLSG A 0 A_JumpIfTargetInLOS("Fire2", 0, JLOSF_DEADNOJUMP)
PLSG A 0 A_PRINTBOLD ("No Target In LOS",0.3,3)
Goto Ready
Fire2:
PLSG A 0 ACS_EXECUTEalways(102,0,0,0,0)
PLSG A 1 A_SpawnItemex("Turret",0,0,20.0,0,0,0,0,SXF_SETMASTER)
PLSG A 0 A_Takeinventory("FT",1)
PLSG B 10
PLSG B 1 A_ReFire
Goto Ready
Spawn:
PLAS A -1
Stop
}
}
ACTOR NewMarine: DoomPlayer
{
Player.startitem "BeamTester"
DamageFactor "newPlasma",0
Species "Turret"
+THRUSPECIES
States{
Death:
TNT1 A 2 ACS_EXECUTEalways(102,0,0,0,0)
TNT1 A -1
stop
}
}
ACS:
Code: Select all
#library "acs-code"
#include "zcommon.acs"
#Define TID_Player 1000
#Define TID_Turret 64
#Define TID_Target 70064
script 4300 ENTER{
Thing_ChangeTid(0, TID_Player + PlayerNumber());
}
script 4301 RESPAWN{
Thing_ChangeTid(TID_Player + PlayerNumber(), 0);
Thing_ChangeTid(0, TID_Player + PlayerNumber());
}
script 101 (void){
int MasterTID = GetActorProperty (0, APROP_MasterTID);
Thing_ChangeTid(0, TID_Turret + MasterTID);
int TurretTID = TID_Turret + MasterTID;
ACS_EXECUTEalways(300,0,MasterTID,TurretTID);
while (ThingCount(T_NONE,TurretTID) == 1){
SetActorPosition(TurretTID, GetActorX(MasterTID), GetActorY(MasterTID), GetActorZ(MasterTID)+20.0 , 0);
delay(1);
}
}
script 102 (void){
If(!Checkinventory("FT")){
Thing_Remove(PlayerNumber()+TID_Player+TID_Turret);
}
}
script 103 (void){
int TurretTID = ActivatorTID();
int TT = TurretTID + TID_Target;
If( GetActorProperty(0,APROP_TargetTID)==(TT)){
SetActivator(TT);
Thing_ChangeTID(TT,0);
}
Delay(1);
}
script 300 (int MasterTID, int TurretTID){
if(SetActivator(MasterTID,AAPTR_PLAYER_GETTARGET))
{
int oldTID = ActivatorTID();
If(oldTID == 0){
int TargetTID = TurretTID+TID_Target;
Thing_ChangeTID(0, TargetTID);
SetActivator(TurretTID);
SetPointer(AAPTR_TARGET, TargetTID);
}
else{
SetActivator(TurretTID);
SetPointer(AAPTR_TARGET, oldTID);
}
}
}