23 return "WatchtowerKit";
46 super.UpdateVisuals();
48 SetAnimationPhase(
"level_1", 0);
49 SetAnimationPhase(
"level_1_wall_1", 0);
50 SetAnimationPhase(
"level_1_wall_2", 0);
51 SetAnimationPhase(
"level_1_wall_3", 0);
53 string part_name =
"";
92 if ( !super.CanReceiveAttachment( attachment, slotId ) )
98 if ( !
GetGame().IsDedicatedServer() )
107 if ( action_initiator == player )
138 if (partName !=
"level_1_base" && partName !=
"level_2_base" && partName !=
"level_3_base" && partName !=
"level_3_roof")
150 excluded_objects.Insert(
this );
151 excluded_objects.Insert( player );
153 if ( partName ==
"level_2_base" )
155 min_max[0] = GetMemoryPointPos(
"level_2_wall_1_down_min" );
156 min_max[1] = GetMemoryPointPos(
"level_2_roof_max" );
158 else if ( partName ==
"level_3_base" )
160 min_max[0] = GetMemoryPointPos(
"level_3_wall_1_down_min" );
161 min_max[1] = GetMemoryPointPos(
"level_3_wall_2_up_max" );
163 else if ( partName ==
"level_3_roof" )
165 min_max[0] = GetMemoryPointPos(
"level_3_roof_min" );
166 min_max[1] = GetMemoryPointPos(
"level_3_roof_max" );
172 min_max[0] = GetMemoryPointPos(
"level_1_collisioncheck_min" );
173 min_max[1] = GetMemoryPointPos(
"level_1_roof_max" );
176 center[1] = center[1] + ( min_max[1][1] + min_max[0][1] ) / 2;
178 edge_length[0] = min_max[1][0] - min_max[0][0];
179 edge_length[2] = min_max[1][2] - min_max[0][2];
180 edge_length[1] = min_max[1][1] - min_max[0][1];
183 GetGame().
IsBoxCollidingGeometry( center, orientation, edge_length, ObjIntersectView, ObjIntersectGeom, excluded_objects, collided_objects );
184 if ( collided_objects.Count() > 0 )
186 foreach (
Object o : collided_objects )
188 if (Building.Cast(o))
201 if ( !super.CanDisplayAttachmentSlot( slot_id ) )
208 if ( slot_name.
Contains(
"material_l1" ) || slot_name.
Contains(
"level_1_" ) )
210 if ( slot_name.
Contains(
"woodenlogs" ) )
219 else if ( slot_name.
Contains(
"material_l2" ) || slot_name.
Contains(
"level_2_" ) )
221 if ( slot_name.
Contains(
"woodenlogs" ) )
230 else if ( slot_name.
Contains(
"material_l3" ) || slot_name.
Contains(
"level_3_" ) )
232 if ( slot_name.
Contains(
"woodenlogs" ) )
248 if ( !super.CanDisplayAttachmentCategory( category_name ) )
255 if ( category_name.
Contains(
"level_1" ) )
257 if ( category_name.
Contains(
"level_1_" ) )
267 if ( category_name.
Contains(
"level_2" ) )
269 if ( category_name.
Contains(
"level_2_" ) )
279 if ( category_name.
Contains(
"level_3" ) )
281 if ( category_name.
Contains(
"level_3_" ) )
303 if ( slot_name.
Contains(
"material_l1" ) || slot_name.
Contains(
"level_1_" ) )
305 if ( slot_name.
Contains(
"woodenlogs" ) )
315 if ( slot_name.
Contains(
"material_l2" ) || slot_name.
Contains(
"level_2_" ) )
317 if ( slot_name.
Contains(
"material_l2w" ) || slot_name.
Contains(
"level_2_wall" ) )
323 if ( slot_name.
Contains(
"woodenlogs" ) )
334 if ( slot_name.
Contains(
"material_l3" ) || slot_name.
Contains(
"level_3_" ) )
336 if ( slot_name.
Contains(
"material_l3w" ) || slot_name.
Contains(
"level_3_wall" ) )
342 if ( slot_name.
Contains(
"woodenlogs" ) )
362 vector player_pos = player.GetPosition();
365 if ( MemoryPointExists( selection ) )
367 pos = ModelToWorld( GetMemoryPointPos( selection ) );
370 if (
Math.
AbsFloat( player_pos[1] - pos[1] ) <= max_dist )
387 if ( selection.
Contains(
"level_1_" ) )
390 if ( selection.
Contains(
"level_2_" ) )
393 if ( selection.
Contains(
"level_3_" ) )
401 super.AfterStoreLoad();
408 super.OnPartBuiltServer( player, part_name, action_id );
415 super.OnPartDismantledServer( player, part_name, action_id );
420 override void OnPartDestroyedServer( Man player,
string part_name,
int action_id,
bool destroyed_by_connected_part =
false )
422 super.OnPartDestroyedServer( player, part_name, action_id );
435 bool has_memory_point = MemoryPointExists( selection );
437 if ( has_memory_point )
439 ref_pos = ModelToWorld( GetMemoryPointPos( selection ) );
445 ref_dir = ref_pos - player.GetPosition();
451 player_dir = player.GetDirection();
455 if ( ref_dir.
Length() != 0 )
460 if ( has_memory_point )
484 if ( MemoryPointExists( selection ) )
486 ref_pos = ModelToWorld( GetMemoryPointPos( selection ) );
494 if ( ref_dir.
Length() > 0.5 )
496 float dot =
vector.
Dot( cam_dir, ref_dir );
510 if ( selection !=
"")
514 vector player_pos = player.GetPosition();
516 vector ref_dir = GetDirection();
522 min = -GetMemoryPointPos(
"interact_min" );
523 max = -GetMemoryPointPos(
"interact_max" );
525 vector dir_to_tower = tower_pos - player_pos;
527 float len = dir_to_tower.
Length();
534 vector test_angles = dir_to_tower_angle - ref_dir_angle;
538 if (test_position[0] > max[0] || test_position[0] < min[0] || test_position[2] > max[2] || test_position[2] < min[2] )
548 if ( MemoryPointExists( selection ) )
550 vector selection_pos = ModelToWorld( GetMemoryPointPos( selection ) );
551 float distance =
vector.
Distance( selection_pos, player.GetPosition() );
580 #ifdef DIAG_DEVELOPER
588 excludes = {
"_metal_"};
592 excludes = {
"_wood_"};
601 super.OnDebugSpawn();
607 GetInventory().CreateInInventory(
"CamoNet");
612 BarbedWire wire = BarbedWire.Cast(GetInventory().CreateInInventory(
"BarbedWire"));
613 wire.SetMountedState(
true);
ActionFoldBaseBuildingObjectCB ActionContinuousBaseCB ActionFoldBaseBuildingObject()
ActionPlaceObjectCB ActiondeployObjectCB ActionPlaceObject()
void AddAction(typename actionName)
Construction GetConstruction()
override bool CanDisplayAttachmentCategory(string category_name)
override void OnDebugSpawn()
override bool IsPlayerInside(PlayerBase player, string selection)
static const string BASE_WALL_NAME
override bool CanDisplayAttachmentSlot(int slot_id)
static const string BASE_VIEW_NAME
override string GetConstructionKitType()
static const int MAX_WATCHTOWER_WALLS
override bool CheckLevelVerticalDistance(float max_dist, string selection, PlayerBase player)
const float MIN_ACTION_DETECTION_ANGLE_RAD
override bool CanPutIntoHands(EntityAI parent)
override array< string > OnDebugSpawnBuildExcludes()
Excludes certain parts from being built by OnDebugSpawn, uses Contains to compare.
override void UpdateVisuals()
override bool PerformRoofCheckForBase(string partName, PlayerBase player, out bool result)
override void OnPartBuiltServer(notnull Man player, string part_name, int action_id)
override void SetActions()
override bool CheckSlotVerticalDistance(int slot_id, PlayerBase player)
override bool IsFacingCamera(string selection)
override bool IsFacingPlayer(PlayerBase player, string selection)
const float MAX_ACTION_DETECTION_DISTANCE
override void AfterStoreLoad()
override int GetMeleeTargetType()
override bool HasProperDistance(string selection, PlayerBase player)
override void OnPartDestroyedServer(Man player, string part_name, int action_id, bool destroyed_by_connected_part=false)
override bool CanReceiveAttachment(EntityAI attachment, int slotId)
const float MAX_FLOOR_VERTICAL_DISTANCE
override bool CanBeRepairedToPristine()
static const int MAX_WATCHTOWER_FLOORS
override bool CheckMemoryPointVerticalDistance(float max_dist, string selection, PlayerBase player)
static const string BASE_ROOF_NAME
override void OnPartDismantledServer(notnull Man player, string part_name, int action_id)
proto native bool IsBoxCollidingGeometry(vector center, vector orientation, vector edgeLength, int iPrimaryType, int iSecondaryType, array< Object > excludeObjects, array< Object > collidedObjects=NULL)
Finds all objects with geometry iType that are in choosen oriented bounding box (OBB)
proto native vector GetCurrentCameraDirection()
static bool GetDisablePerformRoofCheck()
PlayerBase GetActionInitiator()
void SetActionInitiator(PlayerBase action_initiator)
static proto bool GetSelectionForSlotId(int slot_Id, out string selection)
static proto native owned string GetSlotName(int id)
converts slot_id to string
provides access to slot configuration
Result for an object found in CGame.IsBoxCollidingGeometryProxy.
proto native float Length()
Returns length of vector (magnitude)
static float Dot(vector v1, vector v2)
Returns Dot product of vector v1 and vector v2.
proto float Normalize()
Normalizes vector. Returns length.
static proto native float Distance(vector v1, vector v2)
Returns the distance between tips of two 3D vectors.
proto vector VectorToAngles()
Converts vector to spherical coordinates with radius = 1.
proto vector AnglesToVector()
Converts spherical coordinates (yaw, pitch, roll in degrees) to unit length vector.
proto native CGame GetGame()
static proto float AbsFloat(float f)
Returns absolute value.
class JsonUndergroundAreaTriggerData GetPosition
bool Contains(string sample)
Returns true if sample is substring of string.
proto int ToLower()
Changes string to lowercase. Returns length.