28 return "WatchtowerKit";
51 super.UpdateVisuals();
53 SetAnimationPhase(
"level_1", 0);
54 SetAnimationPhase(
"level_1_wall_1", 0);
55 SetAnimationPhase(
"level_1_wall_2", 0);
56 SetAnimationPhase(
"level_1_wall_3", 0);
58 string part_name =
"";
97 if ( !super.CanReceiveAttachment( attachment, slotId ) )
103 if ( !
g_Game.IsDedicatedServer() )
112 if ( action_initiator == player )
143 if (partName !=
"level_1_base" && partName !=
"level_2_base" && partName !=
"level_3_base" && partName !=
"level_3_roof")
155 excluded_objects.Insert(
this );
156 excluded_objects.Insert( player );
158 if ( partName ==
"level_2_base" )
160 min_max[0] = GetMemoryPointPos(
"level_2_wall_1_down_min" );
161 min_max[1] = GetMemoryPointPos(
"level_2_roof_max" );
163 else if ( partName ==
"level_3_base" )
165 min_max[0] = GetMemoryPointPos(
"level_3_wall_1_down_min" );
166 min_max[1] = GetMemoryPointPos(
"level_3_wall_2_up_max" );
168 else if ( partName ==
"level_3_roof" )
170 min_max[0] = GetMemoryPointPos(
"level_3_roof_min" );
171 min_max[1] = GetMemoryPointPos(
"level_3_roof_max" );
177 min_max[0] = GetMemoryPointPos(
"level_1_collisioncheck_min" );
178 min_max[1] = GetMemoryPointPos(
"level_1_roof_max" );
181 center[1] = center[1] + ( min_max[1][1] + min_max[0][1] ) / 2;
183 edge_length[0] = min_max[1][0] - min_max[0][0];
184 edge_length[2] = min_max[1][2] - min_max[0][2];
185 edge_length[1] = min_max[1][1] - min_max[0][1];
188 g_Game.IsBoxCollidingGeometry( center,
orientation, edge_length, ObjIntersectView, ObjIntersectGeom, excluded_objects, collided_objects );
189 if ( collided_objects.Count() > 0 )
191 foreach (
Object o : collided_objects )
206 if ( !super.CanDisplayAttachmentSlot( slot_id ) )
213 if ( slot_name.
Contains(
"material_l1" ) || slot_name.
Contains(
"level_1_" ) )
215 if ( slot_name.
Contains(
"woodenlogs" ) )
224 else if ( slot_name.
Contains(
"material_l2" ) || slot_name.
Contains(
"level_2_" ) )
226 if ( slot_name.
Contains(
"woodenlogs" ) )
235 else if ( slot_name.
Contains(
"material_l3" ) || slot_name.
Contains(
"level_3_" ) )
237 if ( slot_name.
Contains(
"woodenlogs" ) )
253 if ( !super.CanDisplayAttachmentCategory( category_name ) )
260 if ( category_name.
Contains(
"level_1" ) )
262 if ( category_name.
Contains(
"level_1_" ) )
272 if ( category_name.
Contains(
"level_2" ) )
274 if ( category_name.
Contains(
"level_2_" ) )
284 if ( category_name.
Contains(
"level_3" ) )
286 if ( category_name.
Contains(
"level_3_" ) )
308 if ( slot_name.
Contains(
"material_l1" ) || slot_name.
Contains(
"level_1_" ) )
310 if ( slot_name.
Contains(
"woodenlogs" ) )
320 if ( slot_name.
Contains(
"material_l2" ) || slot_name.
Contains(
"level_2_" ) )
322 if ( slot_name.
Contains(
"material_l2w" ) || slot_name.
Contains(
"level_2_wall" ) )
328 if ( slot_name.
Contains(
"woodenlogs" ) )
339 if ( slot_name.
Contains(
"material_l3" ) || slot_name.
Contains(
"level_3_" ) )
341 if ( slot_name.
Contains(
"material_l3w" ) || slot_name.
Contains(
"level_3_wall" ) )
347 if ( slot_name.
Contains(
"woodenlogs" ) )
367 vector player_pos = player.GetPosition();
370 if ( MemoryPointExists( selection ) )
372 pos = ModelToWorld( GetMemoryPointPos( selection ) );
375 if (
Math.
AbsFloat( player_pos[1] - pos[1] ) <= max_dist )
392 if ( selection.
Contains(
"level_1_" ) )
395 if ( selection.
Contains(
"level_2_" ) )
398 if ( selection.
Contains(
"level_3_" ) )
406 super.AfterStoreLoad();
413 super.OnPartBuiltServer( player, part_name, action_id );
420 super.OnPartDismantledServer( player, part_name, action_id );
425 override void OnPartDestroyedServer( Man player,
string part_name,
int action_id,
bool destroyed_by_connected_part =
false )
427 super.OnPartDestroyedServer( player, part_name, action_id );
440 bool has_memory_point = MemoryPointExists( selection );
442 if ( has_memory_point )
444 ref_pos = ModelToWorld( GetMemoryPointPos( selection ) );
450 ref_dir = ref_pos - player.GetPosition();
456 player_dir = player.GetDirection();
460 if ( ref_dir.
Length() != 0 )
465 if ( has_memory_point )
489 if ( MemoryPointExists( selection ) )
491 ref_pos = ModelToWorld( GetMemoryPointPos( selection ) );
499 if ( ref_dir.
Length() > 0.5 )
501 float dot =
vector.
Dot( cam_dir, ref_dir );
515 if ( selection !=
"")
519 vector player_pos = player.GetPosition();
521 vector ref_dir = GetDirection();
527 min = -GetMemoryPointPos(
"interact_min" );
528 max = -GetMemoryPointPos(
"interact_max" );
530 vector dir_to_tower = tower_pos - player_pos;
532 float len = dir_to_tower.
Length();
539 vector test_angles = dir_to_tower_angle - ref_dir_angle;
543 if (test_position[0] > max[0] || test_position[0] < min[0] || test_position[2] > max[2] || test_position[2] < min[2] )
553 if ( MemoryPointExists( selection ) )
555 vector selection_pos = ModelToWorld( GetMemoryPointPos( selection ) );
556 float distance =
vector.
Distance( selection_pos, player.GetPosition() );
589 #ifdef DIAG_DEVELOPER
597 excludes = {
"_metal_"};
601 excludes = {
"_wood_"};
610 super.OnDebugSpawn();
616 GetInventory().CreateInInventory(
"CamoNet");
621 BarbedWire wire = BarbedWire.Cast(GetInventory().CreateInInventory(
"BarbedWire"));
622 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 bool DestroyOnFall()
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 bool IsActionTargetVisible()
override void OnPartDismantledServer(notnull Man player, string part_name, int action_id)
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.
static proto float AbsFloat(float f)
Returns absolute value.
vector GetPosition()
Get the world position of the Effect.
bool Contains(string sample)
Returns true if sample is substring of string.
proto int ToLower()
Changes string to lowercase. Returns length.