For a proper SAI(where you can report enemies) server must be involved to replicate data beween clients, is that easy to do?
I have only done client side scripting, never used replication.
sai is so gay
sai is so gay
if u want spend some time for helping aao try to put some minimal delay between singleshots so ppl dont turn they guns into norecoil hackguns with mousemacros.It's already covered by CVAR.
AAO has always been about realism. The realism of the radar = 0.
An update to stop server admins using mods would be good+1 vote.
You're right. I bet the defense research guys absolutely hate the idea of infantry seeing locations of friendlies and objectives/targets in real time on miniature displays. It would also be stupid to share that information with other branches of military to avoid friendly casualties when support is sent in. Fucking unrealistic.
+1 for kari.
SAI sux mates, pls let the game be like it is now :-)
//================================================================================
// UIHUDCompass.
//================================================================================
class UIHUDCompass extends UIControl;
const kMaxObjectives= 8;
var(None) int ScaledObjectiveTextX;
var(None) int ScaledObjectiveTextY;
var(None) Texture _tLeft;
var(None) Texture _tRight;
var(None) Texture _BracketTexture;
var(None) UIControl _ElementList;
var(None) bool _InitializedObjectives;
var export Texture _tObjectiveSymbols;
var export string _sObjectiveSymbols;
var(None) Texture _tObjectiveUp;
var(None) Texture _tObjectiveDown;
var(None) Texture _tObjectiveLevel;
var export UIHUDCompassPointObj _Objectives;
var(None) UIHUDCompassPointV _TeamPoint;
var(None) Texture _tTeamSSG;
var(None) Texture _tTeamSGT;
var(None) Texture _tTeamPVT;
var(None) Texture _tTeamMedic;
var(None) Material _tTeamBleed;
var input Texture _tFT;
var(None) Texture _tTeamIFVIP;
var(None) Texture _tTeamSFCapt;
var(None) Texture _tTeamSSG1st;
var(None) Texture _tTeamIF;
var(None) bool _bIsSettingTarget;
const kArrowDeadRange= 132;
const kObjectiveArrowScaleX= 0.5;
const kObjectiveSize= 16;
const kObjectiveTextY= 112;
const kObjectiveTextX= 786;
const kLocationTextY= 82;
const kLocationTextX= 786;
const kCompassTextureWidth= 1024;
const kCompassY= 16;
const kCompassHeight= 32;
const kCompassWidth= 512;
function Destroyed ()
{
local(None) int i;
local(None) UIControl Control;
local(None) UIControl NextControl;
Super.Destroyed();
_tLeft=None;
_tRight=None;
_BracketTexture=None;
_TeamPoint=None;
_tTeamSSG=None;
_tTeamSGT=None;
_tTeamPVT=None;
_tTeamMedic=None;
_tTeamBleed=None;
_tTeamIFVIP=None;
_tTeamSFCapt=None;
_tTeamSSG1st=None;
_tTeamIF=None;
i=0;
JL0068:
if ( i < 8 )
{
_tObjectiveSymbols[i]=None;
if ( _Objectives[i] != None )
{
_Objectives[i].Destroyed();
_Objectives[i]=None;
}
i++;
goto JL0068;
}
Control=_ElementList;
JL00C9:
if ( Control != None )
{
NextControl=Control.cNextControl;
Control.Destroyed();
Control=NextControl;
goto JL00C9;
}
_ElementList=None;
return;
}
function IsSettingTarget ()
{
local(None) bool ReturnValue;
return _bIsSettingTarget;
return;
}
function SetTarget ()
{
local(None) bool E;
_bIsSettingTarget=E;
return;
}
function Draw ()
{
local(None) Canvas Canvas;
local(None) int oldstyle;
local(None) GameReplicationInfo GRI;
local(None) PlayerController PC;
if ( cFrame.cActor == None )
{
return;
}
if ( Pawn(cFrame.cActor) == None )
{
return;
}
oldstyle=Canvas.Style;
if ( !_InitializedObjectives )
{
InitializeObjectives();
}
PC=cFrame.cHUD.PlayerOwner;
GRI=PC.GameReplicationInfo;
if ( ShouldDrawCompass() )
{
if ( (GRI != None) && !GRI.bHUDHideCompass && (PC != None) && !PC.bHUDHideCompass )
{
DrawLocation(Canvas);
}
}
if ( ShouldDrawObjectiveList() )
{
if ( (GRI != None) && !GRI.bHUDHideCompass && (PC != None) && !PC.bHUDHideCompass )
{
DrawObjectiveList(Canvas);
}
}
Canvas.Style=oldstyle;
return;
}
function InitializeObjectives ()
{
local(None) BaseObjective obj;
local(None) UIHUDCompassPointObj objcompass;
local(None) int objnum;
objnum=0;
foreach cFrame.cActor.DynamicActors(Class'BaseObjective',obj)
{
if ( obj.IsA('AGP_Objective') )
{
objcompass=new (None,Class'UIHUDCompassPointObj');
objcompass.setObjective(obj);
objnum=obj.GetHUDPosition();
if ( objnum > 8 )
{
objnum=8 - 1;
}
objcompass.SetTexture(_tObjectiveSymbols[objnum]);
objcompass.SetText(_sObjectiveSymbols[objnum]);
objcompass.setOrder(objnum);
objcompass.Create(cFrame,cScreen,0,-1,0);
if ( _Objectives[objnum] == None )
{
_Objectives[objnum]=objcompass;
} else {
objcompass.cNextControl=_Objectives[objnum];
_Objectives[objnum]=objcompass;
}
}
}
_InitializedObjectives=True;
return;
}
function DrawCompass ()
{
local(None) Canvas Canvas;
local(None) float X;
local(None) float Y;
local(None) float fFOV;
local(None) int iCompassSrc;
local(None) int iCompassStart;
local(None) float fDegrees;
local(None) float Width;
if ( !ShouldDrawCompass() )
{
return;
}
if ( _tLeft == None )
{
Canvas.SetPos(100.00,100.00);
Canvas.DrawText("UIHUDCompass::Draw NO TEXTURE");
return;
}
Canvas.Style=6;
if ( cFrame != None )
{
Canvas.DrawColor=cFrame.cHUD.HUDColor;
}
X=Canvas.ClipX / 2 - 512 * cFrame.fScaleX / 2;
Y=16.00;
Canvas.SetPos(X,Y);
fFOV=Pawn(cFrame.cActor).Controller.FovAngle;
iCompassSrc=fFOV * 1024 * 2 / 360;
fDegrees=cFrame.cActor.Rotation.Yaw * 360.00 / 65535.00;
iCompassStart=fDegrees * 1024 * 2 / 360;
iCompassStart -= iCompassSrc / 2;
iCompassStart=iCompassStart % 2 * 1024;
JL01CC:
if ( iCompassStart < 0 )
{
iCompassStart += 2 * 1024;
goto JL01CC;
}
if ( iCompassStart <= 1024 )
{
if ( 1024 > iCompassSrc + iCompassStart )
{
Canvas.DrawTile(_tLeft,512.00 * cFrame.fScaleX,32.00 * cFrame.fScaleY,iCompassStart,0.00,iCompassSrc,_tLeft.VSize);
} else {
Width=(1024.00 - iCompassStart) / iCompassSrc;
Canvas.DrawTile(_tLeft,Width * 512 * cFrame.fScaleX,32.00 * cFrame.fScaleY,iCompassStart,0.00,_tLeft.USize - iCompassStart,_tLeft.VSize);
Canvas.SetPos(X + Width * 512 * cFrame.fScaleX,Y);
Width=1.00 - Width;
Canvas.DrawTile(_tRight,Width * 512 * cFrame.fScaleX,32.00 * cFrame.fScaleY,0.00,0.00,iCompassSrc - _tRight.USize - iCompassStart,_tRight.VSize);
}
} else {
if ( 1024 * 2 > iCompassSrc + iCompassStart )
{
Canvas.DrawTile(_tRight,512.00 * cFrame.fScaleX,32.00 * cFrame.fScaleY,iCompassStart - 1024,0.00,iCompassSrc,_tRight.VSize);
} else {
Width=(2.00 * 1024 - iCompassStart) / iCompassSrc;
Canvas.DrawTile(_tRight,Width * 512 * cFrame.fScaleX,32.00 * cFrame.fScaleY,iCompassStart - 1024,0.00,_tRight.USize - iCompassStart - 1024,_tRight.VSize);
Canvas.SetPos(X + Width * 512 * cFrame.fScaleX,Y);
Width=1.00 - Width;
Canvas.DrawTile(_tLeft,Width * 512 * cFrame.fScaleX,32.00 * cFrame.fScaleY,0.00,0.00,iCompassSrc - 2 * 1024 - iCompassStart,_tRight.VSize);
}
}
X=Canvas.ClipX / 2 - 512 * cFrame.fScaleX / 2;
Y=16.00;
Canvas.SetPos(X,Y);
Canvas.DrawTile(_BracketTexture,512.00 * cFrame.fScaleX,32.00 * cFrame.fScaleY,0.00,0.00,_BracketTexture.USize,_BracketTexture.VSize);
return;
}
function DrawLocation ()
{
local(None) Canvas Canvas;
local(None) Texture tobj;
local(None) float X;
local(None) float Y;
local(None) float XL;
local(None) float YL;
local(None) float Xi;
local(None) float Yi;
local(None) PlayerReplicationInfo myPRI;
local(None) string LocString;
local(None) Volume C;
local(None) BaseObjective obj;
if ( (Pawn(cFrame.cActor) != None) && (Pawn(cFrame.cActor).PlayerReplicationInfo != None) )
{
myPRI=Pawn(cFrame.cActor).PlayerReplicationInfo;
}
if ( (myPRI == None) || myPRI.isDead() )
{
return;
}
X=786.00 * cFrame.fScaleX;
Y=82.00 * cFrame.fScaleY;
C=myPRI.GetCommVolume();
if ( C != None )
{
obj=BaseObjective(myPRI.GetNearbyObjective(C));
}
if ( obj != None )
{
tobj=_tObjectiveSymbols[obj.GetHUDPosition()];
Xi=16.00 * cFrame.fScaleX;
Yi=16.00 * cFrame.fScaleY;
Canvas.SetPos(X - Xi,Y);
Canvas.DrawTile(tobj,Xi,Yi,0.00,0.00,tobj.USize,tobj.VSize);
Xi *= 1.50;
}
LocString=myPRI.GetLocationName(C);
Canvas.TextSize(LocString,XL,YL);
Canvas.SetPos(X - XL - Xi,Y);
Canvas.DrawTextClipped(LocString);
return;
}
function DrawObjectives ()
{
local(None) Canvas Canvas;
local(None) bool ReturnValue;
local(None) int ctr;
local(None) UIControl Current;
local(None) UIHUDCompassPoint currentpoint;
local(None) bool retval;
retval=False;
ctr=0;
JL000F:
if ( ctr < 8 )
{
Current=_Objectives[ctr];
JL002C:
if ( Current != None )
{
currentpoint=UIHUDCompassPoint(Current);
if ( currentpoint.IsA('UIHUDCompassPointObj') )
{
DrawCompassPoint(currentpoint,Canvas);
retval=True;
} else {
if ( (currentpoint != None) && currentpoint.IsOnCompass(Pawn(cFrame.cActor).Controller) )
{
DrawCompassPoint(currentpoint,Canvas);
}
}
Current=Current.cNextControl;
goto JL002C;
}
ctr++;
goto JL000F;
}
return retval;
return;
}
function ScaleControl ()
{
local(None) Canvas Canvas;
Super.ScaleControl(Canvas);
ScaledObjectiveTextX=786 * cFrame.fScaleX;
ScaledObjectiveTextY=112 * cFrame.fScaleY;
return;
}
function DrawObjectiveList ()
{
local(None) Canvas Canvas;
local(None) float X;
local(None) float Y;
local(None) float XL;
local(None) float YL;
local(None) int ctr;
local(None) UIControl Current;
local(None) UIHUDCompassPointObj currentobj;
local(None) string ObjString;
X=ScaledObjectiveTextX;
Y=ScaledObjectiveTextY;
Canvas.SetPos(X,Y);
if ( _bIsSettingTarget )
{
Canvas.TextSize("SET SQUAD TARGET:",XL,YL);
Canvas.SetPos(X - XL,Y);
Canvas.DrawTextClipped("SET SQUAD TARGET:");
} else {
Canvas.TextSize("OBJECTIVES",XL,YL);
Canvas.SetPos(X - XL,Y);
Canvas.DrawTextClipped("OBJECTIVES");
}
Y += YL * 0.50;
ctr=0;
JL011B:
if ( ctr < 8 )
{
Current=_Objectives[ctr];
JL0138:
if ( Current != None )
{
currentobj=UIHUDCompassPointObj(Current);
if ( currentobj != None )
{
ObjString=currentobj.GetString();
}
if ( (currentobj == None) || !currentobj.IsEnabled() || (ObjString == "") )
{
Current=Current.cNextControl;
} else {
Canvas.TextSize(ObjString,XL,YL);
Y += YL;
Canvas.SetPos(X - XL,Y);
Canvas.DrawTextClipped(ObjString);
Current=Current.cNextControl;
}
goto JL0138;
}
ctr++;
goto JL011B;
}
return;
}
function DrawCompassPoint ()
{
local(None) UIHUDCompassPoint currentpoint;
local(None) Canvas Canvas;
local(None) float ptdegrees;
local(None) float fDegrees;
local(None) Material ptTexture;
local(None) float X;
local(None) float Y;
local(None) float XL;
local(None) float YL;
local(None) byte FT;
local(None) PlayerReplicationInfo myPRI;
if ( !_InitializedObjectives )
{
InitializeObjectives();
}
fDegrees=cFrame.cActor.Rotation.Yaw * 360.00 / 65535.00;
if ( (currentpoint == None) || !currentpoint.IsOnCompass(Pawn(cFrame.cActor).Controller) )
{
return;
}
if ( currentpoint.IsA('UIHUDCompassPointObj') && cFrame.cHUD.bHideCompassObjPoints )
{
return;
}
ptTexture=currentpoint.GetTexture();
ptdegrees=currentpoint.GetRotation(cFrame.cActor);
ptdegrees=ptdegrees - fDegrees;
if ( ptdegrees > 180.00 )
{
ptdegrees=ptdegrees - 360.00;
} else {
if ( ptdegrees < -180.00 )
{
ptdegrees=ptdegrees + 360.00;
}
}
X=ptdegrees / Pawn(cFrame.cActor).Controller.FovAngle / 2.00 * 512 * cFrame.fScaleX / 2.00;
if ( X < -512 * cFrame.fScaleX / 2.00 )
{
X= -512 * cFrame.fScaleX / 2.00;
}
if ( X > 512 * cFrame.fScaleX / 2.00 )
{
X=512.00 * cFrame.fScaleX / 2.00;
}
X += Canvas.ClipX / 2.00;
XL=16.00 * cFrame.fScaleX;
X -= XL / 2.00;
X -= XL * 0.50 / 2.00;
Y=16.00 + 32 * cFrame.fScaleY + 5;
Canvas.SetPos(X,Y);
Canvas.DrawTile(ptTexture,XL,16.00 * cFrame.fScaleY,0.00,0.00,ptTexture.MaterialUSize(),ptTexture.MaterialVSize());
FT=currentpoint.getFT();
if ( FT != 255 )
{
Canvas.SetPos(X + 16 * cFrame.fScaleX / 4,Y + (16 + 2) * cFrame.fScaleY);
Canvas.DrawTile(_tFT[FT],XL / 2,16.00 * cFrame.fScaleY / 2,0.00,0.00,_tFT[FT].USize,_tFT[FT].VSize);
}
Canvas.SetPos(X + XL,Y);
YL=currentpoint.CompareHeight(cFrame.cActor);
if ( YL < -132 )
{
ptTexture=_tObjectiveDown;
} else {
if ( YL > 132 )
{
ptTexture=_tObjectiveUp;
} else {
ptTexture=_tObjectiveLevel;
}
}
Canvas.DrawTile(ptTexture,XL * 0.50,16.00 * cFrame.fScaleY,0.00,0.00,ptTexture.MaterialUSize(),ptTexture.MaterialVSize());
if ( (Pawn(cFrame.cActor) != None) && (Pawn(cFrame.cActor).PlayerReplicationInfo != None) )
{
myPRI=Pawn(cFrame.cActor).PlayerReplicationInfo;
if ( (myPRI.Team != None) && currentpoint.IsA('UIHUDCompassPointObj') && UIHUDCompassPointObj(currentpoint).IsSquadTarget(myPRI.Team.TeamIndex) )
{
Canvas.SetPos(X,Y + (16 + 2) * cFrame.fScaleY);
ptTexture=currentpoint.GetTexture();
Canvas.DrawTile(ptTexture,XL,2.00,2.00,2.00,4.00,4.00);
}
}
return;
}
function DrawPlayer ()
{
local(None) Canvas Canvas;
local(None) PlayerReplicationInfo Player;
local(None) Material Icon;
if ( Icon == None )
{
return;
} else {
if ( Icon == _tTeamBleed )
{
Canvas.SetDrawColor(255,0,0,Canvas.DrawColor.A);
}
}
_TeamPoint.setVector(Player.GetPawnLocation());
_TeamPoint.SetTexture(Icon);
_TeamPoint.setFT(Player.FT);
DrawCompassPoint(_TeamPoint,Canvas);
Canvas.DrawColor=cFrame.cHUD.HUDColor;
return;
}
function GetPlayerIcon ()
{
local(None) PlayerReplicationInfo myPRI;
local(None) PlayerReplicationInfo otherPRI;
local(None) Material ReturnValue;
if ( (otherPRI == None) || otherPRI.isDead() || (myPRI == otherPRI) )
{
return None;
}
if ( myPRI.bIsMedic )
{
if ( otherPRI.bCallForMedic )
{
return _tTeamBleed;
}
}
if ( otherPRI.bIsMedic )
{
if ( myPRI.bCallForMedic || (myPRI.FT == otherPRI.FT) )
{
return _tTeamMedic;
}
}
if ( otherPRI.IsSquadLeader() && !otherPRI.bGuerrillaPS && !otherPRI.bSpecialForcesPS )
{
return _tTeamSSG;
} else {
if ( otherPRI.IsSquadLeader() && otherPRI.bSpecialForcesPS && otherPRI.bQualifiedSF )
{
return _tTeamSFCapt;
} else {
if ( otherPRI.IsSquadLeader() && otherPRI.bVIPPS )
{
return _tTeamIFVIP;
} else {
return None;
}
}
}
if ( myPRI.IsSquadLeader() )
{
if ( otherPRI.isTeamLeader() && !otherPRI.bSpecialForcesPS && !otherPRI.bGuerrillaPS )
{
return _tTeamSGT;
} else {
if ( otherPRI.isTeamLeader() && otherPRI.bSpecialForcesPS && otherPRI.bQualifiedSF )
{
return _tTeamSSG1st;
} else {
return None;
}
}
} else {
if ( myPRI.isTeamLeader() )
{
if ( (otherPRI.FT == myPRI.FT) && !otherPRI.bSpecialForcesPS && !otherPRI.bGuerrillaPS )
{
return _tTeamPVT;
} else {
if ( (otherPRI.FT == myPRI.FT) && otherPRI.bSpecialForcesPS && otherPRI.bQualifiedSF )
{
return _tTeamSSG;
} else {
if ( (otherPRI.FT == myPRI.FT) && otherPRI.bGuerrillaPS )
{
return _tTeamIF;
}
}
}
} else {
if ( (otherPRI.FT == myPRI.FT) && otherPRI.isTeamLeader() )
{
return _tTeamSGT;
}
}
}
return None;
return;
}
function DrawTeam ()
{
local(None) Canvas Canvas;
local(None) PlayerReplicationInfo myPRI;
local(None) PlayerReplicationInfo otherPRI;
local(None) int i;
if ( _TeamPoint == None )
{
_TeamPoint=new (None,Class'UIHUDCompassPointV');
}
if ( (Pawn(cFrame.cActor) != None) && (Pawn(cFrame.cActor).PlayerReplicationInfo != None) )
{
myPRI=Pawn(cFrame.cActor).PlayerReplicationInfo;
}
if ( (myPRI == None) || (myPRI.Team == None) )
{
return;
}
i=0;
JL00A3:
if ( i < myPRI.Team.Size )
{
otherPRI=myPRI.Team.GetFromList(i);
DrawPlayer(Canvas,otherPRI,GetPlayerIcon(myPRI,otherPRI));
i++;
goto JL00A3;
}
return;
}
function SetTexture ()
{
local(None) Texture pleft;
return;
}
function SetBracketTexture ()
{
local(None) Texture Tex;
_BracketTexture=Tex;
return;
}
function ShouldDrawCompass ()
{
local(None) bool ReturnValue;
local(None) Weapon wpn;
if ( cFrame.cHUD.PlayerOwner.IsInState('MedicTraining_SittingAtDesk') || cFrame.cHUD.PlayerOwner.IsInState('MedicTraining_SittingAtDesk2') || cFrame.cHUD.PlayerOwner.IsInState('MedicTraining_TakingExam') || cFrame.cHUD.PlayerOwner.IsInState('MedicTraining_TakingExam2') )
{
return False;
}
if ( Pawn(cFrame.cActor) == None )
{
return False;
}
wpn=Pawn(cFrame.cActor).Weapon;
if ( wpn == None )
{
return True;
}
return !wpn.IsZoomed();
return;
}
function ShouldDrawLocation ()
{
local(None) bool ReturnValue;
return False;
return;
}
function ShouldDrawObjectiveList ()
{
local(None) bool ReturnValue;
return cFrame.cHUD.bShowObjectives && !cFrame.cHUD.bShowScores;
return;
}
function GetLastControl ()
{
local(None) UIControl ReturnValue;
local(None) UIControl Control;
Control=_ElementList;
JL000B:
if ( Control != None )
{
if ( Control.cNextControl == None )
{
return Control;
}
Control=Control.cNextControl;
goto JL000B;
}
return Control;
return;
}
function AddControlToTail ()
{
local(None) UIControl Control;
local(None) UIControl lastcontrol;
lastcontrol=GetLastControl();
if ( lastcontrol == None )
{
_ElementList=Control;
} else {
lastcontrol.cNextControl=Control;
}
return;
}
function GetControl ()
{
local(None) int Id;
local(None) UIControl ReturnValue;
local(None) UIControl Control;
Control=_ElementList;
JL000B:
if ( Control != None )
{
if ( Control.GetID() == Id )
{
return Control;
}
Control=Control.cNextControl;
goto JL000B;
}
return None;
return;
}
function EnableControl ()
{
local(None) int Id;
local(None) bool State;
local(None) bool ReturnValue;
local(None) UIControl Control;
Control=GetControl(Id);
if ( Control == None )
{
return False;
} else {
Control.SetEnabled(State);
return True;
}
return;
}
defaultproperties
{
_tLeft=Texture'T_AA2_UI.HUD.hud_nav_compass_01'
_tRight=Texture'T_AA2_UI.HUD.hud_nav_compass_02'
_tObjectiveSymbols(0)=Texture'T_AA2_UI.HUD.ui_hud_obj_A'
_tObjectiveSymbols(1)=Texture'T_AA2_UI.HUD.ui_hud_obj_B'
_tObjectiveSymbols(2)=Texture'T_AA2_UI.HUD.ui_hud_obj_C'
_tObjectiveSymbols(3)=Texture'T_AA2_UI.HUD.ui_hud_obj_D'
_tObjectiveSymbols(4)=Texture'T_AA2_UI.HUD.ui_hud_obj_E'
_tObjectiveSymbols(5)=Texture'T_AA2_UI.HUD.ui_hud_obj_F'
_tObjectiveSymbols(6)=Texture'T_AA2_UI.HUD.ui_hud_obj_G'
_tObjectiveSymbols(7)=Texture'T_AA2_UI.HUD.ui_hud_obj_H'
_sObjectiveSymbols(0)="A"
_sObjectiveSymbols(1)="B"
_sObjectiveSymbols(2)="C"
_sObjectiveSymbols(3)="D"
_sObjectiveSymbols(4)="E"
_sObjectiveSymbols(5)="F"
_sObjectiveSymbols(6)="G"
_sObjectiveSymbols(7)="H"
_tObjectiveUp=Texture'T_AA2_UI.HUD.ui_hud_obj_up'
_tObjectiveDown=Texture'T_AA2_UI.HUD.ui_hud_obj_down'
_tObjectiveLevel=Texture'T_AA2_UI.HUD.ui_hud_obj_level'
_tTeamSSG=Texture'T_AA2_UI.HUD.hud_rank_ssg'
_tTeamSGT=Texture'T_AA2_UI.HUD.hud_rank_sgt'
_tTeamPVT=Texture'T_AA2_UI.HUD.hud_rank_pvt'
_tTeamMedic=Texture'T_AA2_UI.HUD.ui_hud_medic'
_tTeamBleed=FinalBlend'T_AA2_UI.HUD.ui_hud_bleeding_fb'
_tFT(0)=Texture'T_AA2_UI.HUD.hud_fireteam_a'
_tFT(1)=Texture'T_AA2_UI.HUD.hud_fireteam_b'
_tFT(2)=Texture'T_AA2_UI.HUD.hud_fireteam_c'
_tFT(3)=Texture'T_AA2_UI.HUD.hud_fireteam_d'
_tTeamIFVIP=Texture'T_AA2_UI.HUD.hud_rank_VIP'
_tTeamSFCapt=Texture'T_AA2_UI.HUD.hud_rank_captain'
_tTeamSSG1st=Texture'T_AA2_UI.HUD.hud_rank_staffsgt_1st'
_tTeamIF=Texture'T_AA2_UI.HUD.hud_rank_indigenous'
}
//================================================================================
// UIHUD_Radar.
//================================================================================
class UIHUD_Radar extends UIControl;
var(None) Material _tGrid;
var(None) Range GridRange;
var(None) float CurrentRange;
var(None) Position GridUV;
var(None) array<UIHUD_RadarDot> RadarDotPool;
var(None) PlayerReplicationInfo myPRI;
var(None) bool bFrontUp;
var(None) bool bMap;
var(None) int MapSize;
var(None) bool bInitialized;
function Initialize ()
{
local(None) string map_name;
local(None) Material NewMap;
map_name="T_AA2_UI.Map.Map_" $ cFrame.cActor.Level.sLevelName;
NewMap=Material(DynamicLoadObject(map_name,Class'Texture'));
if ( NewMap != None )
{
_tGrid=NewMap;
}
bInitialized=True;
return;
}
function ShouldDrawRadar ()
{
local(None) bool ReturnValue;
local(None) Weapon wpn;
if ( Pawn(cFrame.cActor).Controller.IsInState('MedicTraining_SittingAtDesk') || Pawn(cFrame.cActor).Controller.IsInState('MedicTraining_SittingAtDesk2') || Pawn(cFrame.cActor).Controller.IsInState('MedicTraining_TakingExam') || Pawn(cFrame.cActor).Controller.IsInState('MedicTraining_TakingExam2') )
{
return False;
}
if ( Pawn(cFrame.cActor) == None )
{
return False;
}
wpn=Pawn(cFrame.cActor).Weapon;
if ( wpn == None )
{
return True;
}
return !wpn.IsZoomed();
return;
}
function Draw ()
{
local(None) Canvas C;
local(None) GameReplicationInfo GRI;
local(None) PlayerController PC;
if ( !bInitialized )
{
Initialize();
}
PC=cFrame.cHUD.PlayerOwner;
GRI=PC.GameReplicationInfo;
if ( ShouldDrawRadar() )
{
if ( !GRI.bHUDHideRadar && !PC.bHUDHideRadar )
{
UpdateRadarDots();
DrawRadarGrid(C);
}
}
return;
}
function DrawRadarGrid ()
{
local(None) Canvas C;
C.SetPos(_ScaledPos.X,_ScaledPos.Y);
C.SetDrawColor(255,255,255,C.DrawColor.A);
C.DrawTile(_tGrid,_ScaledPos.W,_ScaledPos.H,GridUV.X,GridUV.Y,GridUV.W,GridUV.H);
C.DrawColor=cFrame.cHUD.HUDColor;
return;
}
function UpdateRadarDots ()
{
local(None) TeamInfo MyTeam;
local(None) int i;
local(None) int draw_num;
local(None) float max_distance_s;
myPRI=Pawn(cFrame.cActor).PlayerReplicationInfo;
MyTeam=myPRI.Team;
if ( MyTeam != None )
{
i=0;
JL0048:
if ( i < MyTeam.Size )
{
if ( ShouldDraw(MyTeam.TeamList[i]) )
{
UpdateRadarDot(MyTeam.TeamList[i],draw_num);
max_distance_s=FMax(max_distance_s,RadarDotPool[draw_num].GetDistanceSquared());
draw_num++;
}
i++;
goto JL0048;
}
} else {
UpdateRadarDot(myPRI,draw_num);
draw_num++;
}
UpdateCurrentRange(Sqrt(max_distance_s));
i=draw_num;
JL0101:
if ( i < RadarDotPool )
{
RadarDotPool[i].bVisible=False;
i++;
goto JL0101;
}
return;
}
function CreateNewRadarDot ()
{
local(None) UIHUD_RadarDot NewRadarDot;
cScreen.AddHUDBaseDisplay("AGP_UI.UIHUD_RadarDot",-1,_Pos,1);
NewRadarDot=UIHUD_RadarDot(cScreen.GetLastControl());
NewRadarDot.SetMyRadar(self);
NewRadarDot.ScaleControl(None);
RadarDotPool[RadarDotPool]=NewRadarDot;
return;
}
function UpdateRadarDot ()
{
local(None) PlayerReplicationInfo PRI;
local(None) int draw_number;
local(None) UIHUD_RadarDot RadarDot;
local(None) Vector MyLoc;
local(None) Vector DotLoc;
local(None) Vector RelLoc;
local(None) Rotator R;
JL0000:
if ( RadarDotPool <= draw_number )
{
CreateNewRadarDot();
goto JL0000;
}
RadarDot=RadarDotPool[draw_number];
RadarDot.bVisible=True;
MyLoc=myPRI.GetPawnLocation();
DotLoc=PRI.GetPawnLocation();
RelLoc=MyLoc - DotLoc;
if ( bFrontUp )
{
R.Yaw=myPRI.GetMyPawn().Rotation.Yaw;
RelLoc=RelLoc << R;
}
RadarDot.SetRadarDotXY(RelLoc.X,RelLoc.Y);
return;
}
function ShouldDraw ()
{
local(None) PlayerReplicationInfo PRI;
local(None) bool ReturnValue;
if ( PRI.isDead() )
{
return False;
} else {
return True;
}
return;
}
function UpdateCurrentRange ()
{
local(None) float max_distance;
local(None) float NewRange;
NewRange=FClamp(max_distance * 1.50,GridRange.Min,GridRange.Max);
if ( (NewRange != CurrentRange) || bMap )
{
SetCurrentRange(NewRange);
}
return;
}
function SetCurrentRange ()
{
local(None) float NewRange;
local(None) float ratio;
local(None) float u_max;
local(None) float v_max;
local(None) Vector CenterLoc;
local(None) float U;
local(None) float V;
local(None) float X;
local(None) float Y;
local(None) float X1;
local(None) float X2;
local(None) float Y1;
local(None) float Y2;
CurrentRange=NewRange;
u_max=_tGrid.MaterialUSize();
v_max=_tGrid.MaterialVSize();
if ( bMap )
{
CenterLoc=myPRI.GetMyPawn().Location;
X=CenterLoc.Y;
Y= -CenterLoc.X;
X += MapSize / 2;
Y += MapSize / 2;
X1=X - CurrentRange;
Y1=Y - CurrentRange;
X2=X + CurrentRange;
Y2=Y + CurrentRange;
GridUV.X=u_max * X1 / MapSize;
GridUV.Y=v_max * Y1 / MapSize;
GridUV.W=u_max * (X2 - X1) / MapSize;
GridUV.H=v_max * (Y2 - Y1) / MapSize;
} else {
ratio=1.00 - CurrentRange / GridRange.Max;
U=ratio * u_max / 2;
V=ratio * v_max / 2;
GridUV.X=U;
GridUV.Y=V;
GridUV.W=u_max - U - U;
GridUV.H=v_max - V - V;
}
return;
}
defaultproperties
{
GridRange=(Min=0.00, Max=1.60231035868848196E34)
bMap=True
MapSize=32768
}
//================================================================================
// UIHUD_RadarDot.
//================================================================================
class UIHUD_RadarDot extends UIControl;
var(None) bool bVisible;
var(None) Material _tPlayerDot;
var(None) float X;
var(None) float Y;
var(None) float dot_size;
var(None) Position PlayerXY;
var(None) UIHUD_Radar MyRadar;
function SetMyRadar ()
{
local(None) UIHUD_Radar NewRadar;
MyRadar=NewRadar;
return;
}
function Draw ()
{
local(None) Canvas C;
if ( bVisible )
{
UpdatePlayerDot();
DrawPlayerDot(C);
}
return;
}
function DrawPlayerDot ()
{
local(None) Canvas C;
C.SetPos(PlayerXY.X,PlayerXY.Y);
C.DrawTile(_tPlayerDot,PlayerXY.W,PlayerXY.H,0.00,0.00,_tPlayerDot.MaterialUSize(),_tPlayerDot.MaterialVSize());
return;
}
function UpdatePlayerDot ()
{
local(None) float draw_x;
local(None) float draw_y;
local(None) float draw_size;
local(None) float screen_x;
local(None) float screen_y;
local(None) float Size;
local(None) float size_squared;
local(None) float Range;
Range=MyRadar.CurrentRange;
draw_size=dot_size * (1 - Range / MyRadar.GridRange.Max);
draw_size=FMax(draw_size,8.00);
size_squared=GetDistanceSquared();
if ( size_squared > Range * Range )
{
Size=Sqrt(size_squared);
draw_x=X / Size * Range;
draw_y=Y / Size * Range;
draw_size *= 1.50;
} else {
draw_x=X;
draw_y=Y;
}
screen_x=( -draw_y / Range + 1.00) / 2;
screen_y=(draw_x / Range + 1.00) / 2;
PlayerXY.W=draw_size;
PlayerXY.H=draw_size;
PlayerXY.X=_ScaledPos.X + _ScaledPos.W * screen_x - draw_size / 2;
PlayerXY.Y=_ScaledPos.Y + _ScaledPos.H * screen_y - draw_size / 2;
return;
}
function SetRadarDotXY ()
{
local(None) float new_x;
local(None) float new_y;
X=new_x;
Y=new_y;
return;
}
function GetDistanceSquared ()
{
local(None) float ReturnValue;
return X * X + Y * Y;
return;
}
defaultproperties
{
_tPlayerDot=Texture'T_AA2_UI.HUD.hud_group_army'
dot_size=32.00
}
var bool bShowRadarMap;
var string RadarMapImage;
var float RadarMapSize;
var vector RadarMapOffset;
var array<float> RadarZoomLevels;
How complex should the 2.5 SAI be?In 2.8.5 it was this way:
Show Friendlies
Show Reported Enemies
Show Objectives
Show Reported ESS
What have I forgotten?
It was so long since I played 2.8.5 I've forgotten most things about the 2.8.5 SAI.
You guys should go read the original post...
I read what you wrote in the other thread.
I added the poll here so that I could test the waters before adding some effort of making it myself.
Naturally it would be up to whoever makes these decisions around here now days after the people has their say on the matter if it really would be something valuable to add.
There could always be an option for server owners to turn it on or off on their servers.
bah nobody needs SAI it sux :)
Show reported enemies is good for the guy s that do not have teamspeak .
Thats way i vote yes!
Or for newcomers that still have to learn the map, voted yes tooplus its easier to see for them if its a teammate they are shooting at ;)
plus its easier to see for them if its a teammate they are shooting at ;)and you can prefire easily, without waiting to see if it's a friend or not :D
The percentage of votes for yes are enough for me to start coding.
However the volume of votes has to be higher to reach a conclusive decision, so get your friends to vote.
So that means ur back Eliz? :style:
In a limited function, yes.
I'll be coding on this(SAI Mod) as time permits.
Show reported enemies is good for the guy s that do not have teamspeak .no no, you dont see reported enemies, just a location, you or your teammate reported at.
no no, you dont see reported enemies, just a location, you or your teammate reported at.
When you pressed that key 'enemy spotted' and looked at a location, your friends could see that red point right?
Of course, but it's just a report, and it will vanish after a few seconds if i recall correctly. In that regard, Proving Grounds offers a nice voice chat, it's really fun to communicate by voice and it really makes a difference, tactics wise.
no no, you dont see reported enemies, just a location, you or your teammate reported at.
Its like 2.8.5 whit Z enemie spotted !!??
I dont think we will have a Enemy Spoted function, because this is server side.
Enemy spotted is the main goal of the mod, so it will be in there or there will be no mod.lol always trying to get the best from something :P, thx
Hopefully I'll solve the replication.
Enemy spotted is the main goal of the mod, so it will be in there or there will be no mod.
Hopefully I'll solve the replication.
MapImage=Texture'T_AAO_Maps.SAI.t_maps_sai_bridge'
MapOffset.x=2176.000000;
MapOffset.y=-966.000000;
MapOffset.z=0;
MapSize=14000.000000;
DrawHitIndicator(Canvas);
DrawVehicles(Canvas);
DrawTeam(Canvas);
DrawEnemies(Canvas);
DrawSpottedESS(Canvas);
Should I turn off the "Classic" Compass that is showing at the top when the SAI is used?
DrawSpottedESS
Enemy spotted is the main goal of the mod, so it will be in there or there will be no mod.
Hopefully I'll solve the replication.
Great job! :D I would say the compass won't be needed anymore.
Which "entity" does this stand for?Code: [Select]DrawSpottedESS
Function DrawSpottedESS (Canvas C)
{
local int i;
local HumanController.ESSObjectData ESSObjectSpotted;
local Vector DrawLocation;
local float IconDrawScale;
local float FadeOutBlend;
local Object.Color cLethality;
MyController.ClearOldNonLethalESSSpotted();
for (i=0; i<MyController.FoundESSObject.Length; i++)
{
ESSObjectSpotted=MyController.FoundESSObject[i];
DrawLocation=WorldToMapCoords(ESSObjectSpotted.SpottedLocation);
DrawLocation=MapToScreenCoords(DrawLocation);
DrawLocation.Z=0;
IconDrawScale=FMin(BaseDrawScale,1);
CullRadarElement(DrawLocation,IconDrawScale);
if (! ESSObjectSpotted.bLethal)
{
FadeOutBlend=1 - myLevel.TimeSeconds - ESSObjectSpotted.TimeSpottedSeconds / ESSObjectSpotted.LifeSpan;
FadeOutBlend=FClamp(FadeOutBlend * 2,0,1);
}
else
{
FadeOutBlend=1;
}
if (ESSObjectSpotted.bLethal)
{
cLethality=RedColor;
}
else
{
cLethality=YellowColor;
}
DrawBlink(C,cLethality,DrawLocation.X - DrawOffset_ESSIcon * IconDrawScale,DrawLocation.Y - DrawOffset_ESSIcon * IconDrawScale,ESSIcon.MaterialUSize() * IconDrawScale * cFrame.fScaleX + 5,ESSIcon.MaterialVSize() * IconDrawScale * cFrame.fScaleX + 5,ESSObjectSpotted.BlinkStartTime,ESSObjectSpotted.BlinkEndTime);
C.DrawColor=cLethality;
C.DrawColor.A=FadeOutBlend * 255;
C.SetPos(DrawLocation.X - IconDrawScale * DrawOffset_ESSIcon,DrawLocation.Y - IconDrawScale * DrawOffset_ESSIcon);
C.DrawTileScaled(ESSIcon,IconDrawScale * cFrame.fScaleX,IconDrawScale * cFrame.fScaleX);
}
C.DrawColor=cFrame.cHUD.HUDColor;
}
So if i'm right, everytime you shout ''enemy spotted'', a wild enemy appears on the radar for a couple seconds?
Isn't this gonna cause a huge spam?
It's funny, you're faster at coding something than I am at Photoshopping the same thing :)
I would say that if SAI is enabled, disable overhead compass. That way, people can choose between them.
Maybe keep the compass, it shows your direction with more accuracy and it can be used for precise 203's, nades etc :)
I can't even remember any dropshots anymore :P
NewMapImage=Material(DynamicLoadObject("T_AAO_Maps.SAI.t_maps_sai_" $ myLevel.sLevelName,Class'Texture'));
Struct ImageStratum
{
var float LowerBound;
var float UpperBound;
var Material RadarImage;
};
I'll move all SAI relevant textures to a new package, I will call it T-SAI.utx, any objections?Not from me :)
Do you realize you'll have to make images for us? :)
MouseWheelDown=SAIZoomIn
MouseWheelUp=SAIZoomOut
MouseWheelDown=DecreaseRange
MouseWheelUp=IncreaseRange
Aliases[44]=(Command="DecreaseRange | Zoomout | SAIZoomOut | ShiftDriveGearsDown",Alias="ZoomOut")
Aliases[45]=(Command="IncreaseRange | Zoomin | SAIZoomIn | ShiftDriveGearsUp",Alias="ZoomIn")
MouseWheelDown=Zoomout
MouseWheelUp=Zoomin
as this is an Interaction, must be built with AntiPoke.
and GJ :)
Aliases[41]=(Command="DecreaseRange | SAIZoomOut",Alias="ZoomOut")
Aliases[42]=(Command="IncreaseRange | SAIZoomIn",Alias="ZoomIn")
..
..
MouseWheelDown=ZoomOut
MouseWheelUp=ZoomIn
You can do multiple binds on one item and that should work. Maybe try KeyOps? It's a Windows program that did keybinding for AA.for rpgs it is used sometimes if people know how to handle them.
Increase/Decrease Range I believe is used for RPG and 203 iron sights. You know, the ones that nobody uses :)
stops a lot of dropshots ;)
Any idea how to solve the keybind problem?I'm not sure but, 2.5 has a limit of 39 Aliasses, use 23, 24, 29, 30 and 31 they are useless.Code: [Select]Aliases[41]=(Command="DecreaseRange | SAIZoomOut",Alias="ZoomOut")
Aliases[42]=(Command="IncreaseRange | SAIZoomIn",Alias="ZoomIn")
..
..
MouseWheelDown=ZoomOut
MouseWheelUp=ZoomIn
My limited knowledge sadi it would work, but it don't
Aliases[30]=(Command="DecreaseRange | SAIZoomOut",Alias="ZoomOut") Aliases[31]=(Command="IncreaseRange | SAIZoomIn",Alias="ZoomIn") MouseWheelDown=ZoomOut MouseWheelUp=ZoomIn |
[SAI.MyInteraction]
bRadarShow=True
bRadarShowClassic=False
bRadarShowPlayerInfoNames=True
bRotateRadarAroundPlayer=True
RadarDrawOpacity=255
SAI_MapName=Bridge
SAI_MapOffset=(X=2176.000000,Y=-966.000000,Z=0.000000)
SAI_MapSize=14000.000000
SAI_MapName=Bridge_SE
SAI_MapOffset=(X=656.000000,Y=-768.000000,Z=0.000000)
SAI_MapSize=13000.000000
SAI_MapName=SFSandstorm
SAI_MapOffset=(X=-3616.000000,Y=-14496.000000,Z=0.000000)
SAI_MapSize=13500.000000
SAI_MapName=SFvillage
SAI_MapOffset=(X=-2467.000000,Y=1906.000000,Z=0.000000)
SAI_MapSize=5500.000000
SAI_MapName=FLS
SAI_MapOffset=(X=-1328.000000,Y=-2464.000000,Z=0.000000)
SAI_MapSize=12000.000000
So, does the server admin decide or does the client decide if sai is to be used?
dunno.. what do you think would be the best?as an interaction and inside AP, theres almost no option to SV owners. unless you dont allow to report enemies or make Ap read from the sv.
as an interaction and inside AP, theres almost no option to SV owners. unless you dont allow to report enemies or make Ap read from the sv.
SV=Server?
I think it should be a server option
I think it should be a server option, that way everyone in the server is seeing the same thing... but that just my opinion, see what everyone else thinks?
I think it should be a server option, that way everyone in the server is seeing the same thing... but that just my opinion, see what everyone else thinks?
I'd say, make it mandatory, but people will be angry at me lol :)
I'd say, make it mandatory, but people will be angry at me lol :)why anyone will be angry at you? it has to be on for everyone, its a great feature
why anyone will be angry at you? it has to be on for everyone, its a great featureI don't see how this will affect anyone lol.
I haven't been following this closely, will it have the same functionality as the 2.8.5 one? Like showing enemies spotted locations and what not?
Great work. I've just had an idea, what about showing the player name and maybe health on players? Here's what I'm talking about:eh, I think part of the fun of AA is that you can't just look at some green or blue name to tell if it's a teammate or not.
https://dl.dropboxusercontent.com/u/464376/GameShots/ArmyOps%202009-07-04%2015-35-48-74.png
AA already has info when you get close enough to a friendly/enemy but I'm wondering what people would think if that was disabled in favor of the radar-style info that's tagged onto players? Maybe have a draw distance on it so you couldn't see it across the map but maybe if they're in the next room, you can see it? Maybe it's just a server-side option that's disabled by default?
Small update:
Internal version is now Alpha0.2.
I've spent some time diving into the world of replicating variables on Unreal Engine Games.
I've made some progress on the SAI.
Activating/Deactivation is now done on the Server.
so this hasnt been implemented into the game yet?
It only showed to the FT leader and Squad leader as far as I remember.
you could always see where the FTL and SQL are on the SAI.
Can you describe what you mean, did FTL and SQL have move visuals?
they have especial icons.
Can you describe what you mean, did FTL and SQL have move visuals?
they have especial icons.
Was like a star in a circle if I remember correctlyyes, but 1 icon type for each role.
Please make player option to disable, not only server option.there will be an option for this.
there will be an option for this.
And keep the old compass disabled right? The whole point for the server-side enable/disable is so that people don't try to get the old compass back for dropshots.
Will there be an option to disable that damn thing and get the compass back? ;-)
Good question, I'm just coding the bloddy thing.
I think the best model would be to let Server Admins decide on what of the 2 should be used(SAI/Classical Compass).
Then it's up to the user to show the one the Admin choose.
An example.
On MY server I decide that the SAI are to be used.
You as a Client can choose to see the SAI or not, but you cant choose to see the compass.
*sigh* soldiers aren't trained to use a compass to aim a 203 launcher. You're meant to use the iron sights. Aiming without the iron sights is fine but when you spawn and point to a specific spot on the compass and cross it with the tip of a branch in the map to kill people upon spawn... that's not what this game is about.
what if i dont use a compass to spamnade, but the trees ingame? Maybe also take away the trees?
This would be something that could be covered if we ever get around to refurbishing original maps. Moving the objects around a bit :) Course, spam 203's on Bridge could be easily solved, I've mentioned it before.
I've found a small issue.
Consider this:
When the player is flashed, the screen goes black.
Problem is that since the SAI in painted ontop of the screen with an interaction, the SAI is still showing:
(https://aao25.com/forum/proxy.php?request=http%3A%2F%2Fi41.tinypic.com%2F1zp14wh.png&hash=9a89d60940d30fe1935fade268c08934)
anyone know of a way to (in Unrealscript) detect if a player is flashed?
When a player is flashed the code must be decreasing or fading the screen brightness somewhere, if you could read that brightness variable somewhere?
Humancontroller(myController)._FlashSoundTime
Humancontroller(myController)._FlashSoundIntensity
Seems the bool variable bDisabled is what I was looking for.
I just have to say, great job!! I only got one question, when you report enemie, can you do it without any "delay"? I'm just asking because the probability of some idiot spend the whole round reporting is very high...
On the question on Position and Scale.It is a good spot but some people play on horribly small resolutions so scaling/moving would be good. Also as you said, right now it's coded to be in one spot. Maybe you could pull the current resolution and make the location -400 of what the height is and +300 for the width? I just think more flexibility is better with different resolutions and whatnot. Maybe people only want to see the top half of the SAI so they put it halfway below the bottom of the screen?
I think the current location is the most logical.
Higher up and it will cover part of the console.
It is a good spot but some people play on horribly small resolutions so scaling/moving would be good. Also as you said, right now it's coded to be in one spot. Maybe you could pull the current resolution and make the location -400 of what the height is and +300 for the width? I just think more flexibility is better with different resolutions and whatnot. Maybe people only want to see the top half of the SAI so they put it halfway below the bottom of the screen?You mean something like this?
Alpha Version 0.3 OF 2.5 SAI
Bleeding icon now shows properly
Added SAI Information for
SAI_MapName=EandE
SAI_MapName=HQ_Raid
SAI_MapName=MP_Canyon
SAI_MapName=MP_Steamroller
SAI_MapName=MOUT_McKenna
SAI_MapName=Woodland_Outpost
Shut the SAI when flashed
Added a option in SAI.ini for Transparency
Removed the option to show the Classic Compass when SAI is active
The position och size of SAI is now fullt configurable
Resolution also is not a problem anymore.
Temporary added openslots Code, so That I test all positions
/ELiZ
/2013-08-02
The positions on the sai will need to be based on percentage of screen resolution because I often switch between full screen and window mode which are different resolutions.
//2, Bottom,Left
SAIoffset.X=0+20;
SAIoffset.Y=Canvas.SizeY-((540*SAIScale)/2)-80;
Looks nice Eliz!
But question: is it also possible to play without sai and without compass?
Server admin chooses whether it's classic compass or SAI. If admin chooses SAI, the compass will be gone and it's up to you to enable/disable the SAI.
I've added the possibility to decide the Size of the SAI yourself.
For instance
SAIScale=0.5
Seems the bool variable bDisabled is what I was looking for.
I found out that in some cases(Objectives are also used for detecting Civilian Damage)keep teh good work :)
However, I could use this function to detect if it should be on the radar:
AGP_Objective.IsOnCompass()
So all is good
Added SAi information for
SAI_MapName=Border
SAI_MapName=Dusk
SAI_MapName=JRTC_Farm
SAI_MapName=Mountain_Ambush
SAI_MapName=Mountain_Pass
SAI_MapName=Mountain_Pass_SE
SAI_MapName=MP_Canyon
SAI_MapName=MP_District
SAI_MapName=MP_Interdiction
SAI_MapName=MP_RiverVillage
SAI_MapName=MP_Pool_Day
SAI_MapName=MP_SF_OldTown
SAI_MapName=MP_SF_Floodgate
SAI_MapName=Pipeline
It is now possible to activate full screen radar
In User.ini add this bind
F4=ToggleSAISize
Fixed bug that cased the map to be zoomed wrong.
Other binds related to the SAI
F5=EnemySpotted
Aliases[30]=(Command="DecreaseRange | SAIZoomOut",Alias="ZoomOut")
Aliases[31]=(Command="IncreaseRange | SAIZoomIn",Alias="ZoomIn")
MouseWheelDown=ZoomOut
MouseWheelUp=ZoomIn
To Active SAI on a server dd these to the ini file for the server
ServerActors=SAI.logoloader
ServerActors=SAI.Replicator
ServerPackages=SAI
Get out! That's awesome! Was that in 2.8.5 or is this your creativity?it was in 2.8
it was in 2.8
ELiZ, I was asking if that feature was ever in AA before. I think I've only played a half-dozen or so rounds on 2.8.x so I didn't know.ah..
I'm trying to implement what I can see as the last part - ESSObjectiveReportidk what ESS is, in 2.8.5 theres ES2 objs that you can report, I'm not sure if they appear on SAI
I never played a real round with ESS, can someone explain..
I had the notion that the objectives you could carry was ESS, but reading though the code, I'm not so sure.
Seems to be Objective that after you report them(ESSObjectiveReport), and wait a few seconds, then it turns into an objective
Is ESS even in AA2.5?
Carrying objectives are simply called CarryableObjective if I remember right. I have no idea what ESS is, I've never seen it in mapping for 2.5. Must be a 2.8 feature only.
I see a fair deal of 2.8.5 Uscript that handles AI.
Perhaps, after I finish the SAI, I can look into bringing CoOp to Assist?
No Promises.
I see a fair deal of 2.8.5 Uscript that handles AI.You will probably face DLL links.
Perhaps, after I finish the SAI, I can look into bringing CoOp to Assist?
No Promises.
You will probably face DLL links.
Perhaps, after I finish the SAI, I can look into bringing CoOp to Assist?
That is a possibility.
Looking through AGP_AI, the only native calls I can find are those related to AGP_AI_PBVerification, and those I wont be using anyway. But I'll look into it later on.
You sir will make the entire community jeez in their pants :D
In a way, that is some great news.
That means that all the components needed are now in place, and I can start working on optimizing the code.
Only thing that is not "functioning" right now is the replication of EnemySpotted to all team members.
So I think it will only be a day or two before I can test it with some clients with a special version of the 25Assist Client.
How does the enemy spotted work? Does it find a collision and plot the coordinates? Would it be possible to spawn an emitter at that location? Perhaps a little smoke or flare or something in the 3d space?
local fx_exp_smallfire mySmoke;
mySmoke=myLevel.Spawn(class'fx_exp_smallfire',,,HitLocation);
mySmoke.LifeSpan=8.0;
No it crashes. segmentation fault. Lol, I don't really think its appropriate to drop multiplatform support for some flares that fall on the floor.
is everything working fine ELiZ? replication working?
what happens when you load a map that haven't a SAI image? does it show a GRID image like in 2.8.5?
Added SAi information for
SAI_MapName=SFPCR
SAI_MapName=SFrecon
SAI_MapName=SFtaiga
SAI_MapName=SFWaterTreatment
SAI_MapName=Swamp_Raid
SAI_MapName=Tunnel
SAI_MapName=Weapons_Cache
SAI_MapName=Weapons_Cache_SE
SAI_MapName=Urban_Assault
EnemySpotted Reports are now replicated to all teamMembers
Added location and objective information, this infomation is now set by the SAI.
Objective Selected to be Squad target, now shows as Cyan
After an Objective is taken by Your team, it turns Green
After an Objective is taken by Other team, it turns Red
is everything working fine ELiZ? replication working?
what happens when you load a map that haven't a SAI image? does it show a GRID image like in 2.8.5?
theres a way to make textures blink, see the Bleeding icon above the CE meter, early I put the same texure in a weapon and the weapon was blinking lol, I will find how
I've solved the last problem that was delaying a more public Beta.Great! Public Beta?
I'll setup a SAI Beta Server, and post instructions how to participate
Border
Bridge
Bridge_SE
Dusk
FLS
HQ_Raid
Insurgent_Camp
JRTC_Farm
Mountain_Ambush
Mountain_Pass
Mountain_Pass_SE
MOUT_McKenna
MP_Canyon
MP_District
MP_Interdiction
MP_Pool_Day
MP_RiverVillage
MP_SF_Floodgate
MP_SF_OldTown
MP_Steamroller
Pipeline
Pipeline_SF
SFHospital
SFPCR
SFrecon
SFSandstorm
SFtaiga
SFWaterTreatment
SFvillage
Swamp_Raid
Tunnel
Urban_Assault
Weapons_Cache
Weapons_Cache_SE
Woodland_Outpost
MP_Aztec
MP_Berg
MP_Breakout
MP_Bridge_Construction
MP_Bunker_Crisis
MP_City_Block
MP_ESLDusk
MP_Glass_Kill_House
MP_Ice
MP_Monkey_Island
MP_PBall
MP_Petrol
MP_Pipeline
MP_Residence
MP_Rooftop
MP_Rummage
MP_SF_Contingency
MP_SF_Office_Assault
MP_SF_Refinery
MP_Shipment
MP_Spankyville
MP_Square
MP_TehYetisLair
MP_Urban_Assault_SE
MP_UT04
Radio_Tower
River_Basin
SFarctic
SFblizzard
SFCourtyard
SFcsar
SFDockside
SFextraction
SFoasis
Maybe a bettiny system so when people die they can bet on which team will win. Stuff like that would be awesome imo.
SAI_MapName=MP_UT04
SAI_MapOffset=(X=291.292603,Y=186.048950,Z=0.000000)
SAI_MapSize=1641.891113
;RadarZoomLevels=(X=60,Y=30,Z=15)
Is there another way to do that? Those images are pretty small, especially when zooming in.512x512 is the default for 2.8.5 SAI Images, only SnakePlain had 1024x1024 due to it's size.
Basically reporting enemy tunnel (on ut04), won't show up on the radar?
Well i mean, you can't see the tunnel on ut04 SAI. So i am wondering what happens when you are tunnel and you report an enemy there. The red dot will appear at the spot above it?
Yes
The Enemy Reported Icon will appear at the coordinates where your aimpoint were pointing at.
YesEliz, do you meen "2D projection of coordinates"
The Enemy Reported Icon will appear at the coordinates where your aimpoint were pointing at.
Added SAi information for
None
Using a custom HudColor is now also used for the Custom ObjectiveList and Location Text.
Fixed the Yellow/Green/red/Cyan Objective Color
The ini used by the Server must contain these wors:
ServerActors=SAI.logoloader
ServerActors=SAI.Replicator
ServerPackages=SAI
On the Client, these must be in User.ini
[Engine.Input]
Aliases[30]=(Command="DecreaseRange | SAIZoomOut",Alias="ZoomOut")
Aliases[31]=(Command="IncreaseRange | SAIZoomIn",Alias="ZoomIn")
F4=ToggleSAISize
F5=EnemySpotted
MouseWheelDown=ZoomOut
MouseWheelUp=ZoomIn
2 issues are present that prevents the SAI from being used on a standard Client
1) At the moment SAI is detected as an unknown Interaction and will trigger a detection
2) The 25Assist Client(v7.36 and below) will delete the SAI.u file
by the look of the code, can be done.
If we merged it with AP during Beta testing, every small update to the SAI would trigger an AP update on all servers and clients. Not really an ideal situation. A merger should then be made after the SAI has been fully tested.
If you guys want, I can start a test server for online gameplay. Would I need a new Assist binary for the server?
You running that server though the Assist Client, or are you running dedicated?
Assist client on my "server" which is just a desktop computer at my home.
Then, the need of an updated Assist Client is required.
question, does SAI show up only when the server has it enable?
---------------------------------------------------------------------
Version Information:
---------------------------------------------------------------------
Added SAi information for
SAI_MapName=Radio_Tower
SAI_MapName=River_Basin
SAI_MapName=SFarctic
SAI_MapName=SFblizzard
SAI_MapName=SFCourtyard
SAI_MapName=SFcsar
SAI_MapName=SFDockside
SAI_MapName=SFextraction
SAI_MapName=SFoasis
---------------------------------------------------------------------
Usage:
---------------------------------------------------------------------
The ini used by the Server must contain these rows:
ServerActors=Antipoke.logoloader
ServerActors=Antipoke.SAIReplicator
ServerPackages=Antipoke
On the Client, these must be in User.ini
[Engine.Input]
Aliases[30]=(Command="DecreaseRange | SAIZoomOut",Alias="ZoomOut")
Aliases[31]=(Command="IncreaseRange | SAIZoomIn",Alias="ZoomIn")
F4=ToggleSAISize
F5=EnemySpotted
MouseWheelDown=ZoomOut
MouseWheelUp=ZoomIn
here it does not work(visual part), but I'm using 25Assist, looks like the Replicator doesn't spawn;
I tried non assist server, same issue ;(
so adding AntiPoke.SAIReplicator to server.ini is the method to enable sai on server. without this normal compass will be used?according to ELiZ, yes.
is T-SAI.utx final yet?
so adding AntiPoke.SAIReplicator to server.ini is the method to enable sai on server. without this normal compass will be used?I did, actually SAI stays.
So how do we turn off SAI server side?idk how to turn it off server side.
I need a changelog for Beta0.8 Fixed 1 !