|
|
|
|
|
PlaceObj('ClassDef', { |
|
DefParentClassList = { |
|
"AmbientLifeMarker", |
|
}, |
|
group = "Ambient Life", |
|
id = "AL_Carry", |
|
PlaceObj('PropertyDefCombo', { |
|
'category', "Ambient Life", |
|
'id', "VisitEnter", |
|
'name', "Entering Visit", |
|
'default', "civ_Walk_Carry_Start", |
|
'items', function (self) return GetStates("Male") end, |
|
}), |
|
PlaceObj('PropertyDefCombo', { |
|
'category', "Ambient Life", |
|
'id', "VisitIdle", |
|
'name', "During Visit", |
|
'default', "civ_Walk_Carry", |
|
'items', function (self) return GetStates("Male") end, |
|
}), |
|
PlaceObj('PropertyDefCombo', { |
|
'category', "Ambient Life", |
|
'id', "VisitExit", |
|
'name', "Exit Visit", |
|
'default', "civ_Walk_Carry_End", |
|
'items', function (self) return GetStates("Male") end, |
|
}), |
|
PlaceObj('PropertyDefCombo', { |
|
'category', "Ambient Life", |
|
'id', "MoveStyle", |
|
'name', "Move Style", |
|
'items', function (self) return GetAnimationStyleCombo() end, |
|
}), |
|
PlaceObj('PropertyDefPoint', { |
|
'category', "Ambient Life", |
|
'id', "CarryDestination", |
|
'name', "Destination", |
|
'help', "Where the load needs to be carry to", |
|
'extra_code', 'buttons = {{name = "View", func = function(self) ViewPos(self.CarryDestination) end}}, helper = "absolute_pos"', |
|
}), |
|
PlaceObj('ClassConstDef', { |
|
'name', "VisitPose", |
|
'type', "number", |
|
'value', 1912, |
|
}), |
|
PlaceObj('PropertyDefBool', { |
|
'category', "Ambient Life", |
|
'id', "Teleport", |
|
'name', "Teleport", |
|
}), |
|
PlaceObj('PropertyDefSet', { |
|
'category', "Ambient Life", |
|
'id', "GameStatesFilter", |
|
'name', "States Required for Activation", |
|
'extra_code', "", |
|
'default', set({ |
|
Conflict = false, |
|
}), |
|
'items', function (self) return GetGameStateFilter end, |
|
'three_state', true, |
|
}), |
|
PlaceObj('ClassConstDef', { |
|
'name', "Appearance", |
|
'type', "text", |
|
'value', "Legion_Jose", |
|
}), |
|
PlaceObj('ClassConstDef', { |
|
'name', "ToolEntity", |
|
'type', "text", |
|
'value', "Shanty_CardboardBox_Carry", |
|
}), |
|
PlaceObj('ClassMethodDef', { |
|
'name', "GenerateVisitable", |
|
'code', function (self) |
|
local pos = self:GetPos() |
|
local lookat = pos |
|
|
|
return {self, pos, lookat} |
|
end, |
|
}), |
|
PlaceObj('ClassMethodDef', { |
|
'name', "GameInit", |
|
'code', function (self) |
|
local valid = IsValidEntity(self.ToolEntity) |
|
if valid then |
|
if HasCollisions(self.ToolEntity) then |
|
StoreWarningSource(self, string.format("Spawn Tool '%s' has collision surfaces(or passability colliders) - they will bug the PF!", self.ToolEntity)) |
|
end |
|
self:AttachCarryItem() |
|
else |
|
StoreErrorSource(self, string.format("Invalid ToolEntity '%s'!", self.ToolEntity)) |
|
end |
|
end, |
|
}), |
|
PlaceObj('ClassMethodDef', { |
|
'name', "OnEditorSetProperty", |
|
'params', "prop_id, old_value, ged", |
|
'code', function (self, prop_id, old_value, ged) |
|
if prop_id == "ToolEntity" or prop_id == "ToolAttachOffset" or prop_id == "ToolColors" then |
|
self:AttachCarryItem() |
|
end |
|
end, |
|
}), |
|
PlaceObj('ClassMethodDef', { |
|
'name', "AttachCarryItem", |
|
'code', function (self) |
|
if not IsValidEntity(self.ToolEntity) then return end |
|
|
|
if self.tool_attached then |
|
self:DestroyAttaches(self.tool_attached.class) |
|
end |
|
local marker_attach = PlaceObject(self.ToolEntity) |
|
if self.ToolColors then |
|
marker_attach:SetColorization(self.ToolColors) |
|
end |
|
self:Attach(marker_attach, self:GetSpotBeginIndex(self.ToolSpot)) |
|
if self.ToolAttachOffset then |
|
marker_attach:SetAttachOffset(self.ToolAttachOffset) |
|
end |
|
|
|
DoneObject(self.tool_attached) |
|
self.tool_attached = PlaceObject(self.ToolEntity) |
|
if self.ToolColors then |
|
self.tool_attached:SetColorization(self.ToolColors) |
|
end |
|
if self.ToolAutoAttachMode then |
|
self.tool_attached:SetAutoAttachMode(self.ToolAutoAttachMode) |
|
end |
|
self.tool_attached:SetPos(self:GetPos()) |
|
end, |
|
}), |
|
PlaceObj('ClassMethodDef', { |
|
'name', "CanVisit", |
|
'params', "unit, for_perpetual, dont_check_dist", |
|
'code', function (self, unit, for_perpetual, dont_check_dist) |
|
if self:IsToolDestroyed() then |
|
return false |
|
end |
|
|
|
return AmbientLifeMarker.CanVisit(self, unit, for_perpetual, dont_check_dist) |
|
end, |
|
}), |
|
PlaceObj('ClassMethodDef', { |
|
'name', "EditorGetText", |
|
'code', function (self) |
|
local texts = AmbientLifeMarker.EditorGetText(self) |
|
if self:IsToolDestroyed() then |
|
texts = (texts and (texts .. "\n") or "") .. "Carry Item is destroyed!" |
|
end |
|
|
|
return texts |
|
end, |
|
}), |
|
PlaceObj('ClassMethodDef', { |
|
'name', "EditorGetTextColor", |
|
'code', function (self) |
|
return self:IsToolDestroyed() and const.clrRed or AmbientLifeMarker.EditorGetTextColor(self) |
|
end, |
|
}), |
|
}) |
|
|
|
PlaceObj('ClassDef', { |
|
DefParentClassList = { |
|
"AmbientLifeMarker", |
|
}, |
|
group = "Ambient Life", |
|
id = "AL_Cower", |
|
PlaceObj('PropertyDefCombo', { |
|
'category', "Ambient Life", |
|
'id', "VisitEnter", |
|
'name', "Entering Visit", |
|
'default', "", |
|
'items', function (self) return GetStates("Male") end, |
|
}), |
|
PlaceObj('PropertyDefCombo', { |
|
'category', "Ambient Life", |
|
'id', "VisitIdle", |
|
'name', "During Visit", |
|
'default', "civ_Standing_Fear", |
|
'items', function (self) return GetStates("Male") end, |
|
}), |
|
PlaceObj('PropertyDefCombo', { |
|
'category', "Ambient Life", |
|
'id', "VisitExit", |
|
'name', "Exit Visit", |
|
'default', "", |
|
'items', function (self) return GetStates("Male") end, |
|
}), |
|
PlaceObj('ClassConstDef', { |
|
'name', "VisitPose", |
|
'type', "number", |
|
'value', 1424, |
|
}), |
|
PlaceObj('ClassConstDef', { |
|
'name', "VisitVariation", |
|
'value', true, |
|
}), |
|
PlaceObj('PropertyDefSet', { |
|
'category', "Ambient Life", |
|
'id', "GameStatesFilter", |
|
'name', "States Required for Activation", |
|
'help', "Map states requirements for the AL marker to be active.", |
|
'extra_code', "", |
|
'default', set( "Conflict" ), |
|
'items', function (self) return GetGameStateFilter() end, |
|
'three_state', true, |
|
}), |
|
PlaceObj('ClassConstDef', { |
|
'name', "Appearance", |
|
'type', "text", |
|
'value', "VillagerMale_01", |
|
}), |
|
PlaceObj('ClassMethodDef', { |
|
'name', "GenerateVisitable", |
|
'code', function (self) |
|
local pos = self:GetPos() |
|
local lookat = pos + Rotate(point(const.SlabSizeX, 0), self:GetAngle()) |
|
|
|
return {self, pos, lookat} |
|
end, |
|
}), |
|
PlaceObj('ClassMethodDef', { |
|
'name', "CanVisit", |
|
'params', "unit, for_perpetual, dont_check_dist", |
|
'code', function (self, unit, for_perpetual, dont_check_dist) |
|
return AmbientLifeMarker.CanVisit(self, unit, for_perpetual, dont_check_dist) |
|
end, |
|
}), |
|
}) |
|
|
|
PlaceObj('ClassDef', { |
|
DefParentClassList = { |
|
"AmbientLifeMarker", |
|
}, |
|
group = "Ambient Life", |
|
id = "AL_Defender_PlayAnimVariation", |
|
PlaceObj('PropertyDefCombo', { |
|
'category', "Ambient Life", |
|
'id', "VisitEnter", |
|
'name', "Entering Visit", |
|
'default', "", |
|
'items', function (self) return GetStates("Male") end, |
|
}), |
|
PlaceObj('PropertyDefCombo', { |
|
'category', "Ambient Life", |
|
'id', "VisitIdle", |
|
'name', "During Visit", |
|
'default', "nw_Standing_Idle", |
|
'items', function (self) return GetStates("Male") end, |
|
}), |
|
PlaceObj('PropertyDefCombo', { |
|
'category', "Ambient Life", |
|
'id', "VisitExit", |
|
'name', "Exit Visit", |
|
'default', "", |
|
'items', function (self) return GetStates("Male") end, |
|
}), |
|
PlaceObj('PropertyDefBool', { |
|
'category', "Ambient Life", |
|
'id', "Teleport", |
|
'name', "Teleport", |
|
}), |
|
PlaceObj('PropertyDefBool', { |
|
'category', "Ambient Life", |
|
'id', "AllowAL", |
|
'name', "Allow AL", |
|
}), |
|
PlaceObj('PropertyDefSet', { |
|
'category', "Ambient Life", |
|
'id', "GameStatesFilter", |
|
'name', "States Required for Activation", |
|
'extra_code', "", |
|
'default', set(), |
|
'items', function (self) return GetGameStateFilter end, |
|
'three_state', true, |
|
}), |
|
PlaceObj('PropertyDefStringList', { |
|
'category', "Ambient Life", |
|
'id', "Groups", |
|
'name', "Groups", |
|
'item_default', "AL_Defender", |
|
'items', function (self) |
|
local items = table.keys2(Groups or empty_table, "sorted") |
|
table.insert(items, 1, "Closest AmbientZoneMarker") |
|
return items |
|
end, |
|
'default', { |
|
"AL_Defender", |
|
}, |
|
'arbitrary_value', true, |
|
}), |
|
PlaceObj('ClassConstDef', { |
|
'name', "VisitPose", |
|
'type', "number", |
|
'value', 1912, |
|
}), |
|
PlaceObj('ClassConstDef', { |
|
'name', "VisitVariation", |
|
'value', true, |
|
}), |
|
PlaceObj('ClassConstDef', { |
|
'name', "Appearance", |
|
'type', "text", |
|
'value', "Commando_Foreign_01", |
|
}), |
|
PlaceObj('ClassMethodDef', { |
|
'name', "GenerateVisitable", |
|
'code', function (self) |
|
local pos = self:GetPos() |
|
local lookat = pos + Rotate(point(const.SlabSizeX, 0), self:GetAngle()) |
|
|
|
return {self, pos, lookat} |
|
end, |
|
}), |
|
}) |
|
|
|
PlaceObj('ClassDef', { |
|
Comment = "Complicated one - has its own Visit() and spawned unit", |
|
DefParentClassList = { |
|
"AmbientLifeMarker", |
|
"GameDynamicDataObject", |
|
}, |
|
group = "Ambient Life", |
|
id = "AL_Football", |
|
PlaceObj('PropertyDefCombo', { |
|
'category', "Ambient Life", |
|
'id', "VisitEnter", |
|
'name', "Entering Visit", |
|
'default', "", |
|
'items', function (self) return GetStates("Male") end, |
|
}), |
|
PlaceObj('PropertyDefCombo', { |
|
'category', "Ambient Life", |
|
'id', "VisitIdle", |
|
'name', "During Visit", |
|
'default', "civ_Ambient_PlayFootball", |
|
'items', function (self) return GetStates("Male") end, |
|
}), |
|
PlaceObj('PropertyDefCombo', { |
|
'category', "Ambient Life", |
|
'id', "VisitExit", |
|
'name', "Exit Visit", |
|
'default', "", |
|
'items', function (self) return GetStates("Male") end, |
|
}), |
|
PlaceObj('PropertyDefCombo', { |
|
'category', "Ambient Life", |
|
'id', "PartnerUnitDataDef", |
|
'name', "Partner's Unit Data Def", |
|
'items', function (self) return table.keys(UnitDataDefs, "sorted") end, |
|
}), |
|
PlaceObj('PropertyDefPoint', { |
|
'category', "Ambient Life", |
|
'id', "PartnerLocation", |
|
'name', "Partner Location", |
|
'help', "The other player to pass to", |
|
'extra_code', 'buttons = {{name = "View", func = function(self) ViewPos(self.Partner) end}}, helper = "absolute_pos", helper_class = "PropertyHelper_AppearanceObjectAbsolutePos", use_object = true', |
|
}), |
|
PlaceObj('PropertyDefNumber', { |
|
'category', "Ambient Life", |
|
'id', "BallSpeedMin", |
|
'name', "Ball Speed Min", |
|
'help', "Minimum speed of the ball", |
|
'default', 3000, |
|
'scale', "m", |
|
}), |
|
PlaceObj('PropertyDefNumber', { |
|
'category', "Ambient Life", |
|
'id', "BallSpeedMax", |
|
'name', "Ball Speed Max", |
|
'help', "Maximum speed of the ball", |
|
'default', 6000, |
|
'scale', "m", |
|
}), |
|
PlaceObj('PropertyDefNumber', { |
|
'category', "Ambient Life", |
|
'id', "BallRPMMin", |
|
'name', "Ball RPM Min", |
|
'help', "Minimum RPM of the ball", |
|
'default', 30, |
|
}), |
|
PlaceObj('PropertyDefNumber', { |
|
'category', "Ambient Life", |
|
'id', "BallRPMMax", |
|
'name', "Ball RPM Max", |
|
'help', "Maximum RPM of the ball", |
|
'default', 80, |
|
}), |
|
PlaceObj('PropertyDefObject', { |
|
'category', "Ambient Life", |
|
'id', "unit", |
|
'name', "Unit", |
|
'help', "the visitor", |
|
'dont_save', true, |
|
'extra_code', "no_edit = true", |
|
}), |
|
PlaceObj('PropertyDefObject', { |
|
'category', "Ambient Life", |
|
'id', "partner", |
|
'name', "Partner", |
|
'help', "the actual unit - cloned from the visitor", |
|
'dont_save', true, |
|
'extra_code', "no_edit = true", |
|
}), |
|
PlaceObj('PropertyDefObject', { |
|
'category', "Ambient Life", |
|
'id', "ball", |
|
'name', "Ball", |
|
'help', "the ball - passed between the units", |
|
'dont_save', true, |
|
'extra_code', "no_edit = true", |
|
}), |
|
PlaceObj('PropertyDefObject', { |
|
'category', "Ambient Life", |
|
'id', "player_killed", |
|
'name', "Player Killed", |
|
'help', "the ball - passed between the units", |
|
'dont_save', true, |
|
'extra_code', "no_edit = true", |
|
}), |
|
PlaceObj('ClassMethodDef', { |
|
'name', "GenerateVisitable", |
|
'code', function (self) |
|
local pos = self:GetPos() |
|
local lookat = pos + Rotate(point(const.SlabSizeX, 0), self:GetAngle()) |
|
|
|
return {self, pos, lookat} |
|
end, |
|
}), |
|
PlaceObj('ClassMethodDef', { |
|
'name', "Despawn", |
|
'code', function (self) |
|
if IsValid(self.unit) then |
|
self.unit:SetBehavior() |
|
self.unit:SetCommand("Idle") |
|
end |
|
if IsValid(self.partner) then |
|
DoneObject(self.partner) |
|
self.partner = false |
|
end |
|
if IsValid(self.ball) then |
|
DoneObject(self.ball) |
|
self.ball = false |
|
end |
|
AmbientLifeMarker.Despawn(self) |
|
end, |
|
}), |
|
PlaceObj('ClassMethodDef', { |
|
'name', "StartVisit", |
|
'params', "unit", |
|
'code', function (self, unit) |
|
self:SpawnTool(unit) |
|
self.ball = PlaceObject("Shanty_Ball_01") |
|
unit:Attach(self.ball, unit:GetSpotBeginIndex("Ball1")) |
|
|
|
self.unit = unit |
|
self:SpawnPartner() |
|
self.partner:Face(unit) |
|
unit:Face(self.partner) |
|
self:SetVisitAnimation(unit) |
|
if unit.perpetual_marker then |
|
local phase = self:Random(unit:TimeToMoment(1, "hit")) |
|
unit:SetPhaseHighLevel(phase) |
|
end |
|
end, |
|
}), |
|
PlaceObj('ClassMethodDef', { |
|
'name', "SpawnPartner", |
|
'params', "unit", |
|
'code', function (self, unit) |
|
if IsValid(self.partner) then return end |
|
|
|
local unit_def = UnitDataDefs[self.PartnerUnitDataDef] |
|
|
|
local pers_session_id = (unit_def and (unit_def.PersistentSessionId or "") ~= "") and unit_def.PersistentSessionId |
|
local session_id = pers_session_id or GenerateUniqueUnitDataId("AmbientSpawnDef", gv_CurrentSectorId or "A1", "ClonedFootballPartner") |
|
local unitdatadef_id = unit_def and unit_def.id or self.unit.unitdatadef_id |
|
|
|
self.partner = SpawnUnit(unitdatadef_id, session_id) |
|
CheckUniqueSessionId(self.partner) |
|
self.partner.zone = self |
|
self.partner:SetSide("neutral") |
|
self.partner.routine_spawner = self.unit.routine_spawner |
|
|
|
local appearance = ChooseUnitAppearance(unitdatadef_id, self.partner.handle) |
|
self.partner:ApplyAppearance(appearance) |
|
self.partner:SetState("civ_Standing_Idle") |
|
self.partner:SetPos(self.PartnerLocation) |
|
self.partner:SetCommand(false) |
|
self.partner.SetCommand = empty_func |
|
end, |
|
}), |
|
PlaceObj('ClassMethodDef', { |
|
'name', "SetDynamicData", |
|
'params', "data", |
|
'code', function (self, data) |
|
self.partner = data.partner and HandleToObject[data.partner] or false |
|
if not IsKindOf(self.partner, "Unit") then |
|
self.partner = false |
|
end |
|
if self.partner then |
|
if not self:IsPartnerDead() then |
|
self.partner:SetCommand(false) |
|
self.partner.SetCommand = empty_func |
|
end |
|
end |
|
self.player_killed = data.player_killed or false |
|
end, |
|
}), |
|
PlaceObj('ClassMethodDef', { |
|
'name', "GetDynamicData", |
|
'params', "data", |
|
'code', function (self, data) |
|
data.partner = self.partner and self.partner.handle or nil |
|
data.player_killed = self.player_killed or nil |
|
end, |
|
}), |
|
PlaceObj('ClassMethodDef', { |
|
'name', "Visit", |
|
'params', "unit, dest, lookat", |
|
'code', function (self, unit, dest, lookat) |
|
dest = dest or self:GetPos() |
|
|
|
|
|
if not self:GotoEnterSpot(unit, dest) then return end |
|
|
|
|
|
local tool |
|
unit:PushDestructor(function() |
|
if self.perpetual_unit then |
|
self.perpetual_unit = false |
|
end |
|
unit:FreeVisitable() |
|
if not IsValid(unit) then return end |
|
self:ExitVisit(unit) |
|
if not self:IsPartnerDead() then |
|
DoneObject(self.partner) |
|
self.partner = false |
|
end |
|
DoneObject(self.ball) |
|
self.ball = false |
|
end) |
|
|
|
local start_time = GameTime() |
|
self:Enter(unit, dest, lookat) |
|
local visit_duration = GameTime() - start_time |
|
if self.VisitMinDuration and visit_duration >= self.VisitMinDuration then return end |
|
|
|
|
|
self:StartVisit(unit) |
|
repeat |
|
local start_time = GameTime() |
|
if IsValid(unit) and not self:IsPartnerDead() then |
|
local _, ball_spot_index = unit:GetRandomAnim(self.VisitIdle) |
|
self:PlayBall(unit, self.partner, ball_spot_index) |
|
end |
|
if IsValid(unit) and not self:IsPartnerDead() then |
|
local _, ball_spot_index = self.partner:GetRandomAnim(self.VisitIdle) |
|
self:PlayBall(self.partner, unit, ball_spot_index) |
|
end |
|
Sleep(50 + self:Random(50)) |
|
visit_duration = visit_duration + (GameTime() - start_time) |
|
until self:IsPartnerDead() or (self.perpetual_unit and self.perpetual_unit ~= unit) or (self.VisitMinDuration and visit_duration >= self.VisitMinDuration) |
|
|
|
|
|
unit:PopAndCallDestructor() |
|
end, |
|
}), |
|
PlaceObj('ClassMethodDef', { |
|
'name', "PlayBall", |
|
'params', "unit, partner, ball_spot_index", |
|
'code', function (self, unit, partner, ball_spot_index) |
|
Sleep(unit:TimeToMoment(1, "hit") or 0) |
|
self.ball:Detach() |
|
if not self:IsPartnerDead() then |
|
self:ShootBall(partner, ball_spot_index, unit, unit:TimeToAnimEnd()) |
|
end |
|
end, |
|
}), |
|
PlaceObj('ClassMethodDef', { |
|
'name', "IsPartnerDead", |
|
'code', function (self) |
|
return IsValid(self.partner) and self.partner:IsDead() |
|
end, |
|
}), |
|
PlaceObj('ClassMethodDef', { |
|
'name', "EditorGetText", |
|
'code', function (self) |
|
if self.player_killed then |
|
return "AL CAN'T Visit(Inactive do the dead player)" |
|
end |
|
|
|
return AmbientLifeMarker.EditorGetText(self) |
|
end, |
|
}), |
|
PlaceObj('ClassMethodDef', { |
|
'name', "EditorGetTextColor", |
|
'code', function (self) |
|
if self.player_killed then |
|
return const.clrRed |
|
end |
|
|
|
return AmbientLifeMarker.EditorGetTextColor(self) |
|
end, |
|
}), |
|
PlaceObj('ClassMethodDef', { |
|
'name', "CanVisit", |
|
'params', "unit, for_perpetual, dont_check_dist", |
|
'code', function (self, unit, for_perpetual, dont_check_dist) |
|
if self.player_killed or not IsValid(self.partner) then |
|
return false |
|
end |
|
|
|
return AmbientLifeMarker.CanVisit(self, unit, for_perpetual, dont_check_dist) |
|
end, |
|
}), |
|
PlaceObj('ClassMethodDef', { |
|
'name', "ShootBall", |
|
'params', "target, ball_spot_index, ball_dest, kicker, kicker_time_end", |
|
'code', function (self, target, ball_spot_index, ball_dest, kicker, kicker_time_end) |
|
if target:GetEnumFlags(const.efVisible) ~= 0 then |
|
self.ball:SetEnumFlags(const.efVisible) |
|
else |
|
self.ball:ClearEnumFlags(const.efVisible) |
|
end |
|
|
|
local target_spot = "Ball" .. ball_spot_index |
|
local ball_spot = target:GetSpotBeginIndex(target_spot) |
|
local ball_dest = target:GetSpotPos(ball_spot) |
|
local ball_start = self.ball:GetPos() |
|
local ball_dir = ball_dest - ball_start |
|
local ball_speed = self.BallSpeedMin + self:Random(self.BallSpeedMax - self.BallSpeedMin) |
|
local ball_travel_time = MulDivTrunc(ball_dir:Len(), 1000, ball_speed) |
|
local rpm = self.BallRPMMin * 360+ self:Random((self.BallRPMMax - self.BallRPMMin) * 360) |
|
local angle = MulDivTrunc(rpm, ball_travel_time, 1000) |
|
local axis = Rotate(ball_dir, 90 * 60) |
|
self.ball:SetAxis(axis) |
|
self.ball:SetPos(ball_dest, ball_travel_time) |
|
|
|
local suffix = (ball_spot_index == 1) and "" or tostring(ball_spot_index) |
|
local target_football_anim = self.VisitIdle .. suffix |
|
local recieve_moment = target:GetAnimMoment(target_football_anim, "start") |
|
ball_travel_time = (ball_travel_time < recieve_moment) and recieve_moment or ball_travel_time |
|
local target_time_recieve = ball_travel_time - recieve_moment |
|
local time, dt_sleep = 0, 10 |
|
while not self:IsPartnerDead() and time < ball_travel_time do |
|
local dt = Min(dt_sleep, ball_travel_time - time) |
|
dt = kicker_time_end and Min(dt, kicker_time_end - time) or dt |
|
dt = target_time_recieve and Min(dt, target_time_recieve - time) or dt |
|
self.ball:SetAngle(self.ball:GetAngle() + MulDivTrunc(dt, angle, ball_travel_time)) |
|
Sleep(dt) |
|
time = time + dt |
|
if kicker_time_end and time >= kicker_time_end then |
|
local idle_base = (self:Random(100) < 50) and "civ_Standing_Idle" or "civ_Standing_IdlePassive" |
|
local idle_anim = kicker:GetNearbyUniqueRandomAnim(idle_base) |
|
kicker:SetState(idle_anim) |
|
kicker_time_end = false |
|
end |
|
if target_time_recieve and time >= target_time_recieve then |
|
target:SetState(target_football_anim) |
|
target_time_recieve = false |
|
end |
|
end |
|
self.ball:SetAxis(axis_z) |
|
self.ball:SetPos(ball_dest) |
|
end, |
|
}), |
|
PlaceObj('ClassMethodDef', { |
|
'name', "OnHelperCreated", |
|
'params', "helper", |
|
'code', function (self, helper) |
|
helper:ApplyAppearance(self.Appearance) |
|
end, |
|
}), |
|
PlaceObj('ClassConstDef', { |
|
'name', "Appearance", |
|
'type', "text", |
|
'value', "Smiley", |
|
}), |
|
PlaceObj('ClassConstDef', { |
|
'name', "VisitPose", |
|
'type', "number", |
|
'value', 2020, |
|
}), |
|
}) |
|
|
|
PlaceObj('ClassDef', { |
|
DefParentClassList = { |
|
"AmbientLifeMarker", |
|
}, |
|
group = "Ambient Life", |
|
id = "AL_Maraud", |
|
PlaceObj('PropertyDefCombo', { |
|
'category', "Ambient Life", |
|
'id', "VisitEnter", |
|
'name', "Entering Visit", |
|
'default', "", |
|
'items', function (self) return GetStates("Male") end, |
|
}), |
|
PlaceObj('PropertyDefCombo', { |
|
'category', "Ambient Life", |
|
'id', "VisitIdle", |
|
'name', "During Visit", |
|
'default', "civ_Ambient_FindSomething", |
|
'items', function (self) return GetStates("Male") end, |
|
}), |
|
PlaceObj('PropertyDefCombo', { |
|
'category', "Ambient Life", |
|
'id', "VisitExit", |
|
'name', "Exit Visit", |
|
'default', "", |
|
'items', function (self) return GetStates("Male") end, |
|
}), |
|
PlaceObj('ClassConstDef', { |
|
'name', "VisitPose", |
|
'type', "number", |
|
'value', 912, |
|
}), |
|
PlaceObj('ClassConstDef', { |
|
'name', "VisitVariation", |
|
'value', true, |
|
}), |
|
PlaceObj('ClassConstDef', { |
|
'name', "IgnoreGroupsMatch", |
|
'value', true, |
|
}), |
|
PlaceObj('PropertyDefObject', { |
|
'id', "corspe", |
|
'name', "Corspe", |
|
'dont_save', true, |
|
'read_only', true, |
|
}), |
|
PlaceObj('ClassMethodDef', { |
|
'name', "GenerateVisitable", |
|
'code', function (self) |
|
local pos = self:GetPos() |
|
local lookat = pos + Rotate(point(const.SlabSizeX, 0), self:GetAngle()) |
|
|
|
return {self, pos, lookat} |
|
end, |
|
}), |
|
PlaceObj('ClassMethodDef', { |
|
'name', "CanVisit", |
|
'params', "unit, for_perpetual, dont_check_dist", |
|
'code', function (self, unit, for_perpetual, dont_check_dist) |
|
if unit.ImportantNPC then |
|
return false |
|
end |
|
|
|
if self.corpse and unit:GetSide() == "neutral" then |
|
if not IsKindOf(self.corpse, "Unit") then |
|
|
|
return false |
|
end |
|
local side = self.corpse:GetSide() |
|
if not (side == "enemy1" or side == "enemy2" or side == "player1" or side == "player2") then |
|
return false |
|
end |
|
end |
|
|
|
return AmbientLifeMarker.CanVisit(self, unit, for_perpetual, dont_check_dist) |
|
end, |
|
}), |
|
PlaceObj('ClassMethodDef', { |
|
'name', "EditorGetText", |
|
'code', function (self) |
|
if not IsValid(self.corpse) then |
|
return "AL CAN'T Visit(Corpse is missing)" |
|
end |
|
if not IsKindOf(self.corpse, "Unit") then |
|
return "AL CAN'T Visit(Corpse is not Unit?!?)" |
|
end |
|
|
|
return AmbientLifeMarker.EditorGetText(self) |
|
end, |
|
}), |
|
PlaceObj('ClassMethodDef', { |
|
'name', "EditorGetTextColor", |
|
'code', function (self) |
|
if not IsValid(self.corpse) or not IsKindOf(self.corpse, "Unit") then |
|
return const.clrRed |
|
end |
|
|
|
return AmbientLifeMarker.EditorGetTextColor(self) |
|
end, |
|
}), |
|
PlaceObj('ClassMethodDef', { |
|
'name', "GetDynamicData", |
|
'params', "data", |
|
'code', function (self, data) |
|
data.corpse = self.corpse and self.corpse.handle or false |
|
end, |
|
}), |
|
PlaceObj('ClassMethodDef', { |
|
'name', "SetDynamicData", |
|
'params', "data", |
|
'code', function (self, data) |
|
self.corpse = data.corpse and HandleToObject[data.corpse] or false |
|
end, |
|
}), |
|
PlaceObj('ClassMethodDef', { |
|
'name', "OnVisitAnimEnded", |
|
'params', "unit", |
|
'code', function (self, unit) |
|
local item = self.corpse:FindItemInSlot("InventoryDead", function(item, self) |
|
if IsKindOf(item, "Valuables") then |
|
if self:Random(100) < item.drop_chance then |
|
return item |
|
end |
|
end |
|
end, self) |
|
if not item then |
|
item = self.corpse:FindItemInSlot("InventoryDead", function(item, self) |
|
if not IsKindOf(item, "Valuables") then |
|
if self:Random(100) < item.drop_chance then |
|
return item |
|
end |
|
end |
|
end, self) |
|
end |
|
if item then |
|
self.corpse:RemoveItem("InventoryDead", item) |
|
unit:AddItem("Inventory", item) |
|
CreateFloatingText(unit:GetVisualPos(), T(911186423849, "Picked up something")) |
|
end |
|
end, |
|
}), |
|
}) |
|
|
|
PlaceObj('ClassDef', { |
|
DefParentClassList = { |
|
"AmbientLifeMarker", |
|
}, |
|
group = "Ambient Life", |
|
id = "AL_MineWorkPick", |
|
PlaceObj('PropertyDefCombo', { |
|
'category', "Ambient Life", |
|
'id', "VisitEnter", |
|
'name', "Entering Visit", |
|
'default', "", |
|
'items', function (self) return GetStates("Male") end, |
|
}), |
|
PlaceObj('PropertyDefCombo', { |
|
'category', "Ambient Life", |
|
'id', "VisitIdle", |
|
'name', "During Visit", |
|
'default', "civ_Work_Pick", |
|
'items', function (self) return GetStates("Male") end, |
|
}), |
|
PlaceObj('PropertyDefCombo', { |
|
'category', "Ambient Life", |
|
'id', "VisitExit", |
|
'name', "Exit Visit", |
|
'default', "", |
|
'items', function (self) return GetStates("Male") end, |
|
}), |
|
PlaceObj('ClassConstDef', { |
|
'name', "ToolEntity", |
|
'type', "text", |
|
'value', "Mine_PickAxe", |
|
}), |
|
PlaceObj('ClassConstDef', { |
|
'name', "VisitPose", |
|
'type', "number", |
|
'value', 1912, |
|
}), |
|
PlaceObj('ClassMethodDef', { |
|
'name', "GenerateVisitable", |
|
'code', function (self) |
|
local pos = self:GetPos() |
|
local lookat = pos + Rotate(point(const.SlabSizeX, 0), self:GetAngle()) |
|
|
|
return {self, pos, lookat} |
|
end, |
|
}), |
|
}) |
|
|
|
PlaceObj('ClassDef', { |
|
DefParentClassList = { |
|
"AmbientLifeMarker", |
|
}, |
|
group = "Ambient Life", |
|
id = "AL_MineWorkShovel", |
|
PlaceObj('PropertyDefCombo', { |
|
'category', "Ambient Life", |
|
'id', "VisitEnter", |
|
'name', "Entering Visit", |
|
'default', "", |
|
'items', function (self) return GetStates("Male") end, |
|
}), |
|
PlaceObj('PropertyDefCombo', { |
|
'category', "Ambient Life", |
|
'id', "VisitIdle", |
|
'name', "During Visit", |
|
'default', "civ_Work_Shovel", |
|
'items', function (self) return GetStates("Male") end, |
|
}), |
|
PlaceObj('PropertyDefCombo', { |
|
'category', "Ambient Life", |
|
'id', "VisitExit", |
|
'name', "Exit Visit", |
|
'default', "", |
|
'items', function (self) return GetStates("Male") end, |
|
}), |
|
PlaceObj('ClassConstDef', { |
|
'name', "ToolEntity", |
|
'type', "text", |
|
'value', "Mine_Shovel", |
|
}), |
|
PlaceObj('ClassConstDef', { |
|
'name', "VisitPose", |
|
'type', "number", |
|
'value', 8154, |
|
}), |
|
PlaceObj('ClassMethodDef', { |
|
'name', "GenerateVisitable", |
|
'code', function (self) |
|
local pos = self:GetPos() |
|
local lookat = pos + Rotate(point(const.SlabSizeX, 0), self:GetAngle()) |
|
|
|
return {self, pos, lookat} |
|
end, |
|
}), |
|
}) |
|
|
|
PlaceObj('ClassDef', { |
|
DefParentClassList = { |
|
"AmbientLifeMarker", |
|
}, |
|
group = "Ambient Life", |
|
id = "AL_MineWorkSift", |
|
PlaceObj('PropertyDefCombo', { |
|
'category', "Ambient Life", |
|
'id', "VisitEnter", |
|
'name', "Entering Visit", |
|
'default', "", |
|
'items', function (self) return GetStates("Male") end, |
|
}), |
|
PlaceObj('PropertyDefCombo', { |
|
'category', "Ambient Life", |
|
'id', "VisitIdle", |
|
'name', "During Visit", |
|
'default', "civ_Work_Sift", |
|
'items', function (self) return GetStates("Male") end, |
|
}), |
|
PlaceObj('PropertyDefCombo', { |
|
'category', "Ambient Life", |
|
'id', "VisitExit", |
|
'name', "Exit Visit", |
|
'default', "", |
|
'items', function (self) return GetStates("Male") end, |
|
}), |
|
PlaceObj('ClassConstDef', { |
|
'name', "ToolEntity", |
|
'type', "text", |
|
'value', "Mine_WoodenTray", |
|
}), |
|
PlaceObj('ClassConstDef', { |
|
'name', "VisitPose", |
|
'type', "number", |
|
'value', 8154, |
|
}), |
|
PlaceObj('ClassMethodDef', { |
|
'name', "GenerateVisitable", |
|
'code', function (self) |
|
local pos = self:GetPos() |
|
local lookat = pos + Rotate(point(const.SlabSizeX, 0), self:GetAngle()) |
|
|
|
return {self, pos, lookat} |
|
end, |
|
}), |
|
}) |
|
|
|
PlaceObj('ClassDef', { |
|
DefParentClassList = { |
|
"AmbientLifeMarker", |
|
}, |
|
group = "Ambient Life", |
|
id = "AL_Mourn", |
|
PlaceObj('PropertyDefCombo', { |
|
'category', "Ambient Life", |
|
'id', "VisitEnter", |
|
'name', "Entering Visit", |
|
'default', "", |
|
'items', function (self) return GetStates("Male") end, |
|
}), |
|
PlaceObj('PropertyDefCombo', { |
|
'category', "Ambient Life", |
|
'id', "VisitIdle", |
|
'name', "During Visit", |
|
'default', "civ_Ambient_SadCrying", |
|
'items', function (self) return GetStates("Male") end, |
|
}), |
|
PlaceObj('PropertyDefCombo', { |
|
'category', "Ambient Life", |
|
'id', "VisitExit", |
|
'name', "Exit Visit", |
|
'default', "", |
|
'items', function (self) return GetStates("Male") end, |
|
}), |
|
PlaceObj('ClassConstDef', { |
|
'name', "VisitPose", |
|
'type', "number", |
|
'value', 1312, |
|
}), |
|
PlaceObj('ClassConstDef', { |
|
'name', "VisitVariation", |
|
'value', true, |
|
}), |
|
PlaceObj('ClassConstDef', { |
|
'name', "IgnoreGroupsMatch", |
|
'value', true, |
|
}), |
|
PlaceObj('PropertyDefObject', { |
|
'id', "corspe", |
|
'name', "Corspse", |
|
'dont_save', true, |
|
'read_only', true, |
|
}), |
|
PlaceObj('ClassMethodDef', { |
|
'name', "GenerateVisitable", |
|
'code', function (self) |
|
local pos = self:GetPos() |
|
local lookat = pos + Rotate(point(const.SlabSizeX, 0), self:GetAngle()) |
|
|
|
return {self, pos, lookat} |
|
end, |
|
}), |
|
PlaceObj('ClassMethodDef', { |
|
'name', "CanVisit", |
|
'params', "unit, for_perpetual, dont_check_dist", |
|
'code', function (self, unit, for_perpetual, dont_check_dist) |
|
if unit.ImportantNPC then |
|
return false |
|
end |
|
|
|
if self.corpse and unit:GetSide() == "neutral" then |
|
if not IsKindOf(self.corpse, "Unit") then |
|
|
|
return false |
|
end |
|
local side = self.corpse:GetSide() |
|
if side == "enemy1" or side == "enemy2" or side == "neutral" then |
|
return false |
|
end |
|
end |
|
|
|
return AmbientLifeMarker.CanVisit(self, unit, for_perpetual, dont_check_dist) |
|
end, |
|
}), |
|
PlaceObj('ClassMethodDef', { |
|
'name', "EditorGetText", |
|
'code', function (self) |
|
if not IsValid(self.corpse) then |
|
return "AL CAN'T Visit(Corpse is missing)" |
|
end |
|
if not IsKindOf(self.corpse, "Unit") then |
|
return "AL CAN'T Visit(Corpse is not Unit?!?)" |
|
end |
|
|
|
return AmbientLifeMarker.EditorGetText(self) |
|
end, |
|
}), |
|
PlaceObj('ClassMethodDef', { |
|
'name', "EditorGetTextColor", |
|
'code', function (self) |
|
if not IsValid(self.corpse) or not IsKindOf(self.corpse, "Unit") then |
|
return const.clrRed |
|
end |
|
|
|
return AmbientLifeMarker.EditorGetTextColor(self) |
|
end, |
|
}), |
|
PlaceObj('ClassMethodDef', { |
|
'name', "GetDynamicData", |
|
'params', "data", |
|
'code', function (self, data) |
|
data.corpse = self.corpse and self.corpse.handle or false |
|
end, |
|
}), |
|
PlaceObj('ClassMethodDef', { |
|
'name', "SetDynamicData", |
|
'params', "data", |
|
'code', function (self, data) |
|
self.corpse = data.corpse and HandleToObject[data.corpse] or false |
|
end, |
|
}), |
|
}) |
|
|
|
PlaceObj('ClassDef', { |
|
DefParentClassList = { |
|
"AmbientLifeMarker", |
|
}, |
|
group = "Ambient Life", |
|
id = "AL_PlayAnimVariation", |
|
PlaceObj('PropertyDefCombo', { |
|
'category', "Ambient Life", |
|
'id', "VisitEnter", |
|
'name', "Entering Visit", |
|
'default', "", |
|
'items', function (self) return GetStates("Male") end, |
|
}), |
|
PlaceObj('PropertyDefCombo', { |
|
'category', "Ambient Life", |
|
'id', "VisitIdle", |
|
'name', "During Visit", |
|
'default', "nw_Standing_Idle", |
|
'items', function (self) return GetStates("Male") end, |
|
}), |
|
PlaceObj('PropertyDefCombo', { |
|
'category', "Ambient Life", |
|
'id', "VisitExit", |
|
'name', "Exit Visit", |
|
'default', "", |
|
'items', function (self) return GetStates("Male") end, |
|
}), |
|
PlaceObj('PropertyDefBool', { |
|
'category', "Ambient Life", |
|
'id', "Teleport", |
|
'name', "Teleport", |
|
}), |
|
PlaceObj('PropertyDefSet', { |
|
'category', "Ambient Life", |
|
'id', "GameStatesFilter", |
|
'name', "States Required for Activation", |
|
'extra_code', "", |
|
'default', set({ |
|
Conflict = false, |
|
}), |
|
'items', function (self) return GetGameStateFilter end, |
|
'three_state', true, |
|
}), |
|
PlaceObj('ClassConstDef', { |
|
'name', "VisitPose", |
|
'type', "number", |
|
'value', 1912, |
|
}), |
|
PlaceObj('ClassConstDef', { |
|
'name', "VisitVariation", |
|
'value', true, |
|
}), |
|
PlaceObj('ClassConstDef', { |
|
'name', "Appearance", |
|
'type', "text", |
|
'value', "Legion_Jose", |
|
}), |
|
PlaceObj('ClassMethodDef', { |
|
'name', "GenerateVisitable", |
|
'code', function (self) |
|
local pos = self:GetPos() |
|
local lookat = pos + Rotate(point(const.SlabSizeX, 0), self:GetAngle()) |
|
|
|
return {self, pos, lookat} |
|
end, |
|
}), |
|
}) |
|
|
|
PlaceObj('ClassDef', { |
|
DefParentClassList = { |
|
"AmbientLifeMarker", |
|
}, |
|
group = "Ambient Life", |
|
id = "AL_Prostitute_Idle", |
|
PlaceObj('PropertyDefCombo', { |
|
'category', "Ambient Life", |
|
'id', "VisitEnter", |
|
'name', "Entering Visit", |
|
'default', "", |
|
'items', function (self) return GetStates("Male") end, |
|
}), |
|
PlaceObj('PropertyDefCombo', { |
|
'category', "Ambient Life", |
|
'id', "VisitIdle", |
|
'name', "During Visit", |
|
'default', "civ_Seduce_Idle", |
|
'items', function (self) return GetStates("Male") end, |
|
}), |
|
PlaceObj('PropertyDefCombo', { |
|
'category', "Ambient Life", |
|
'id', "VisitExit", |
|
'name', "Exit Visit", |
|
'default', "", |
|
'items', function (self) return GetStates("Male") end, |
|
}), |
|
PlaceObj('ClassConstDef', { |
|
'name', "VisitPose", |
|
'type', "number", |
|
'value', 1912, |
|
}), |
|
PlaceObj('ClassConstDef', { |
|
'name', "VisitVariation", |
|
'value', true, |
|
}), |
|
PlaceObj('ClassConstDef', { |
|
'name', "Appearance", |
|
'type', "text", |
|
'value', "VillagerFemale_01", |
|
}), |
|
PlaceObj('ClassMethodDef', { |
|
'name', "GenerateVisitable", |
|
'code', function (self) |
|
local pos = self:GetPos() |
|
local lookat = pos + Rotate(point(const.SlabSizeX, 0), self:GetAngle()) |
|
|
|
return {self, pos, lookat} |
|
end, |
|
}), |
|
PlaceObj('ClassMethodDef', { |
|
'name', "CanVisit", |
|
'params', "unit, for_perpetual, dont_check_dist", |
|
'code', function (self, unit, for_perpetual, dont_check_dist) |
|
return AmbientLifeMarker.CanVisit(self, unit, for_perpetual, dont_check_dist) and unit:IsProstitute() |
|
end, |
|
}), |
|
}) |
|
|
|
PlaceObj('ClassDef', { |
|
DefParentClassList = { |
|
"AmbientLifeMarker", |
|
}, |
|
group = "Ambient Life", |
|
id = "AL_Prostitute_Parade", |
|
PlaceObj('PropertyDefCombo', { |
|
'category', "Ambient Life", |
|
'id', "VisitEnter", |
|
'name', "Entering Visit", |
|
'default', "", |
|
'items', function (self) return GetStates("Male") end, |
|
}), |
|
PlaceObj('PropertyDefCombo', { |
|
'category', "Ambient Life", |
|
'id', "VisitIdle", |
|
'name', "During Visit", |
|
'default', "civ_Seduce_Parade", |
|
'items', function (self) return GetStates("Male") end, |
|
}), |
|
PlaceObj('PropertyDefCombo', { |
|
'category', "Ambient Life", |
|
'id', "VisitExit", |
|
'name', "Exit Visit", |
|
'default', "", |
|
'items', function (self) return GetStates("Male") end, |
|
}), |
|
PlaceObj('ClassConstDef', { |
|
'name', "VisitPose", |
|
'type', "number", |
|
'value', 11477, |
|
}), |
|
PlaceObj('ClassConstDef', { |
|
'name', "VisitVariation", |
|
'value', true, |
|
}), |
|
PlaceObj('ClassConstDef', { |
|
'name', "Appearance", |
|
'type', "text", |
|
'value', "VillagerFemale_01", |
|
}), |
|
PlaceObj('ClassMethodDef', { |
|
'name', "GenerateVisitable", |
|
'code', function (self) |
|
local pos = self:GetPos() |
|
local lookat = pos + Rotate(point(const.SlabSizeX, 0), self:GetAngle()) |
|
|
|
return {self, pos, lookat} |
|
end, |
|
}), |
|
PlaceObj('ClassMethodDef', { |
|
'name', "CanVisit", |
|
'params', "unit, for_perpetual, dont_check_dist", |
|
'code', function (self, unit, for_perpetual, dont_check_dist) |
|
return AmbientLifeMarker.CanVisit(self, unit, for_perpetual, dont_check_dist) and unit:IsProstitute() |
|
end, |
|
}), |
|
}) |
|
|
|
PlaceObj('ClassDef', { |
|
Comment = "Roam among such markers in the zone", |
|
DefParentClassList = { |
|
"AmbientLifeMarker", |
|
}, |
|
group = "Ambient Life", |
|
id = "AL_Roam", |
|
PlaceObj('PropertyDefCombo', { |
|
'category', "Ambient Life", |
|
'id', "VisitEnter", |
|
'name', "Entering Visit", |
|
'default', "", |
|
'items', function (self) return GetStates("Male") end, |
|
}), |
|
PlaceObj('PropertyDefCombo', { |
|
'category', "Ambient Life", |
|
'id', "VisitIdle", |
|
'name', "During Visit", |
|
'default', "civ_Standing_Idle", |
|
'items', function (self) return GetStates("Male") end, |
|
}), |
|
PlaceObj('PropertyDefCombo', { |
|
'category', "Ambient Life", |
|
'id', "VisitExit", |
|
'name', "Exit Visit", |
|
'default', "", |
|
'items', function (self) return GetStates("Male") end, |
|
}), |
|
PlaceObj('PropertyDefBool', { |
|
'category', "Ambient Life", |
|
'id', "Teleport", |
|
'name', "Teleport", |
|
}), |
|
PlaceObj('PropertyDefBool', { |
|
'category', "Ambient Life", |
|
'id', "DontReorient", |
|
'name', "Don't Reorient", |
|
'help', "Does not reorient the unit to marker position", |
|
}), |
|
PlaceObj('PropertyDefSet', { |
|
'category', "Ambient Life", |
|
'id', "GameStatesFilter", |
|
'name', "States Required for Activation", |
|
'extra_code', "", |
|
'default', set({ |
|
Conflict = false, |
|
}), |
|
'items', function (self) return GetGameStateFilter end, |
|
'three_state', true, |
|
}), |
|
PlaceObj('ClassConstDef', { |
|
'name', "VisitPose", |
|
'type', "number", |
|
'value', 1912, |
|
}), |
|
PlaceObj('ClassConstDef', { |
|
'name', "VisitVariation", |
|
'value', true, |
|
}), |
|
PlaceObj('ClassConstDef', { |
|
'name', "Appearance", |
|
'type', "text", |
|
'value', "VillagerFemale_01", |
|
}), |
|
PlaceObj('ClassMethodDef', { |
|
'name', "ApplyAppearance", |
|
'params', "appearance, force", |
|
'code', function (self, appearance, force) |
|
AppearanceObject.ApplyAppearance(self, appearance, force) |
|
|
|
local clr = const.clrGreen |
|
self:SetColorModifier(clr) |
|
for _, part in ipairs(self.parts) do |
|
part:SetColorModifier(clr) |
|
end |
|
end, |
|
}), |
|
}) |
|
|
|
PlaceObj('ClassDef', { |
|
DefParentClassList = { |
|
"AmbientLifeMarker", |
|
}, |
|
group = "Ambient Life", |
|
id = "AL_SitChair", |
|
PlaceObj('PropertyDefCombo', { |
|
'category', "Ambient Life", |
|
'id', "VisitEnter", |
|
'name', "Entering Visit", |
|
'default', "civ_Sit_Start", |
|
'items', function (self) return GetStates("Male") end, |
|
}), |
|
PlaceObj('PropertyDefCombo', { |
|
'category', "Ambient Life", |
|
'id', "VisitIdle", |
|
'name', "During Visit", |
|
'default', "civ_Sit_Idle", |
|
'items', function (self) return GetStates("Male") end, |
|
}), |
|
PlaceObj('PropertyDefCombo', { |
|
'category', "Ambient Life", |
|
'id', "VisitExit", |
|
'name', "Exit Visit", |
|
'default', "civ_Sit_End", |
|
'items', function (self) return GetStates("Male") end, |
|
}), |
|
PlaceObj('PropertyDefBool', { |
|
'category', "Ambient Life", |
|
'id', "Teleport", |
|
'name', "Teleport", |
|
}), |
|
PlaceObj('PropertyDefSet', { |
|
'category', "Ambient Life", |
|
'id', "GameStatesFilter", |
|
'name', "States Required for Activation", |
|
'extra_code', "", |
|
'default', set({ |
|
Conflict = false, |
|
}), |
|
'items', function (self) return GetGameStateFilter end, |
|
'three_state', true, |
|
}), |
|
PlaceObj('PropertyDefCombo', { |
|
'category', "Ambient Life", |
|
'id', "EditorMarkerVisitAnim", |
|
'name', "Editor Marker Visit Anim", |
|
'default', "editorMarkerAnim_Sit", |
|
'items', function (self) return GetStates("Male") end, |
|
}), |
|
PlaceObj('ClassConstDef', { |
|
'name', "VisitPose", |
|
'type', "number", |
|
'value', 16, |
|
}), |
|
PlaceObj('ClassConstDef', { |
|
'name', "Appearance", |
|
'type', "text", |
|
'value', "Legion_Jose", |
|
}), |
|
PlaceObj('ClassConstDef', { |
|
'name', "VisitSupportCollectionVME", |
|
'value', true, |
|
}), |
|
PlaceObj('ClassMethodDef', { |
|
'name', "CanVisit", |
|
'params', "unit, for_perpetual, dont_check_dist", |
|
'code', function (self, unit, for_perpetual, dont_check_dist) |
|
local enemy, dist = GetNearestEnemy(unit, "ignore awareness") |
|
if enemy and dist <= const.AmbientLife.ForbidSitChairEnemyDist then |
|
return false |
|
end |
|
|
|
return AmbientLifeMarker.CanVisit(self, unit, for_perpetual, dont_check_dist) |
|
end, |
|
}), |
|
}) |
|
|
|
PlaceObj('ClassDef', { |
|
DefParentClassList = { |
|
"AL_SitChair", |
|
}, |
|
group = "Ambient Life", |
|
id = "AL_SitChair_SleepingAtTable", |
|
PlaceObj('PropertyDefCombo', { |
|
'category', "Ambient Life", |
|
'id', "VisitEnter", |
|
'name', "Entering Visit", |
|
'default', "civ_Ambient_SleepingAtTable_Start", |
|
'items', function (self) return GetStates("Male") end, |
|
}), |
|
PlaceObj('PropertyDefCombo', { |
|
'category', "Ambient Life", |
|
'id', "VisitIdle", |
|
'name', "During Visit", |
|
'default', "civ_Ambient_SleepingAtTable", |
|
'items', function (self) return GetStates("Male") end, |
|
}), |
|
PlaceObj('PropertyDefCombo', { |
|
'category', "Ambient Life", |
|
'id', "VisitExit", |
|
'name', "Exit Visit", |
|
'default', "civ_Ambient_SleepingAtTable_End", |
|
'items', function (self) return GetStates("Male") end, |
|
}), |
|
PlaceObj('PropertyDefBool', { |
|
'category', "Ambient Life", |
|
'id', "Teleport", |
|
'name', "Teleport", |
|
}), |
|
PlaceObj('PropertyDefSet', { |
|
'category', "Ambient Life", |
|
'id', "GameStatesFilter", |
|
'name', "States Required for Activation", |
|
'extra_code', "", |
|
'default', set({ |
|
Conflict = false, |
|
}), |
|
'items', function (self) return GetGameStateFilter end, |
|
'three_state', true, |
|
}), |
|
PlaceObj('PropertyDefCombo', { |
|
'category', "Ambient Life", |
|
'id', "EditorMarkerVisitAnim", |
|
'name', "Editor Marker Visit Anim", |
|
'default', "editorMarkerAnim_Sit", |
|
'items', function (self) return GetStates("Male") end, |
|
}), |
|
PlaceObj('ClassConstDef', { |
|
'name', "VisitPose", |
|
'type', "number", |
|
'value', 16, |
|
}), |
|
PlaceObj('ClassConstDef', { |
|
'name', "Appearance", |
|
'type', "text", |
|
'value', "Legion_Jose", |
|
}), |
|
PlaceObj('ClassConstDef', { |
|
'name', "VisitSupportCollectionVME", |
|
'value', true, |
|
}), |
|
PlaceObj('ClassMethodDef', { |
|
'name', "CanVisit", |
|
'params', "unit, for_perpetual, dont_check_dist", |
|
'code', function (self, unit, for_perpetual, dont_check_dist) |
|
local enemy, dist = GetNearestEnemy(unit, "ignore awareness", dont_check_dist) |
|
if enemy and dist <= const.AmbientLife.ForbidSitChairEnemyDist then |
|
return false |
|
end |
|
|
|
return AmbientLifeMarker.CanVisit(self, unit, for_perpetual, dont_check_dist) |
|
end, |
|
}), |
|
}) |
|
|
|
PlaceObj('ClassDef', { |
|
DefParentClassList = { |
|
"AmbientLifeMarker", |
|
}, |
|
group = "Ambient Life", |
|
id = "AL_Talk", |
|
PlaceObj('PropertyDefCombo', { |
|
'category', "Ambient Life", |
|
'id', "VisitEnter", |
|
'name', "Entering Visit", |
|
'default', "", |
|
'items', function (self) return GetStates("Male") end, |
|
}), |
|
PlaceObj('PropertyDefCombo', { |
|
'category', "Ambient Life", |
|
'id', "VisitIdle", |
|
'name', "During Visit", |
|
'default', "nw_Standing_IdlePassive", |
|
'items', function (self) return GetStates("Male") end, |
|
}), |
|
PlaceObj('PropertyDefCombo', { |
|
'category', "Ambient Life", |
|
'id', "VisitAlternate", |
|
'name', "During Visit Alternate", |
|
'help', 'There is some chance to play this animation instead of the original "During Visit" one', |
|
'extra_code', "no_edit = function(self) return self.VisitAlternateChance == 0 end", |
|
'default', "civ_Talking", |
|
'items', function (self) return GetStates("Male") end, |
|
}), |
|
PlaceObj('PropertyDefCombo', { |
|
'category', "Ambient Life", |
|
'id', "VisitExit", |
|
'name', "Exit Visit", |
|
'default', "", |
|
'items', function (self) return GetStates("Male") end, |
|
}), |
|
PlaceObj('ClassConstDef', { |
|
'name', "VisitPose", |
|
'type', "number", |
|
'value', 8866, |
|
}), |
|
PlaceObj('ClassConstDef', { |
|
'name', "VisitVariation", |
|
'value', true, |
|
}), |
|
PlaceObj('ClassConstDef', { |
|
'name', "VisitAlternateVariation", |
|
'value', true, |
|
}), |
|
PlaceObj('ClassConstDef', { |
|
'name', "VisitAlternateChance", |
|
'type', "number", |
|
'value', 50, |
|
}), |
|
PlaceObj('ClassConstDef', { |
|
'name', "EmotionChance", |
|
'type', "number", |
|
'value', 10, |
|
}), |
|
PlaceObj('ClassConstDef', { |
|
'name', "Appearance", |
|
'type', "text", |
|
'value', "VillagerMale_02", |
|
}), |
|
PlaceObj('ClassMethodDef', { |
|
'name', "GenerateVisitable", |
|
'code', function (self) |
|
local pos = self:GetPos() |
|
local lookat = pos + Rotate(point(const.SlabSizeX, 0), self:GetAngle()) |
|
|
|
return {self, pos, lookat} |
|
end, |
|
}), |
|
}) |
|
|
|
PlaceObj('ClassDef', { |
|
DefParentClassList = { |
|
"AmbientLifeMarker", |
|
"GroundAlignedObj", |
|
}, |
|
group = "Ambient Life", |
|
id = "AL_WallLean", |
|
PlaceObj('PropertyDefCombo', { |
|
'category', "Ambient Life", |
|
'id', "VisitEnter", |
|
'name', "Entering Visit", |
|
'default', "civ_Wall_Start", |
|
'items', function (self) return GetStates("Male") end, |
|
}), |
|
PlaceObj('PropertyDefCombo', { |
|
'category', "Ambient Life", |
|
'id', "VisitIdle", |
|
'name', "During Visit", |
|
'default', "civ_Wall_Idle", |
|
'items', function (self) return GetStates("Male") end, |
|
}), |
|
PlaceObj('PropertyDefCombo', { |
|
'category', "Ambient Life", |
|
'id', "VisitExit", |
|
'name', "Exit Visit", |
|
'default', "civ_Wall_End", |
|
'items', function (self) return GetStates("Male") end, |
|
}), |
|
PlaceObj('PropertyDefBool', { |
|
'category', "Ambient Life", |
|
'id', "Teleport", |
|
'name', "Teleport", |
|
}), |
|
PlaceObj('PropertyDefSet', { |
|
'category', "Ambient Life", |
|
'id', "GameStatesFilter", |
|
'name', "States Required for Activation", |
|
'extra_code', "", |
|
'default', set({ |
|
Conflict = false, |
|
}), |
|
'items', function (self) return GetGameStateFilter end, |
|
'three_state', true, |
|
}), |
|
PlaceObj('PropertyDefCombo', { |
|
'category', "Ambient Life", |
|
'id', "EditorMarkerVisitAnim", |
|
'name', "Editor Marker Visit Anim", |
|
'default', "editorMarkerAnim_Wall", |
|
'items', function (self) return GetStates("Male") end, |
|
}), |
|
PlaceObj('ClassConstDef', { |
|
'name', "VisitPose", |
|
'type', "number", |
|
'value', 16, |
|
}), |
|
PlaceObj('ClassConstDef', { |
|
'name', "Appearance", |
|
'type', "text", |
|
'value', "Legion_Jose", |
|
}), |
|
PlaceObj('ClassConstDef', { |
|
'name', "VisitSupportCollectionVME", |
|
'value', true, |
|
}), |
|
PlaceObj('ClassMethodDef', { |
|
'name', "CanVisit", |
|
'params', "unit, for_perpetual, dont_check_dist", |
|
'code', function (self, unit, for_perpetual, dont_check_dist) |
|
local enemy, dist = GetNearestEnemy(unit, "ignore awareness") |
|
if enemy and dist <= const.AmbientLife.ForbidWallLeanEnemyDist then |
|
return false |
|
end |
|
|
|
return AmbientLifeMarker.CanVisit(self, unit, for_perpetual, dont_check_dist) |
|
end, |
|
}), |
|
PlaceObj('ClassMethodDef', { |
|
'name', "EditorCallbackPlace", |
|
'params', "...", |
|
'code', function (self, ...) |
|
AlignedObj.EditorCallbackPlace(self, ...) |
|
AmbientLifeMarker.EditorCallbackPlace(self, ...) |
|
end, |
|
}), |
|
PlaceObj('ClassMethodDef', { |
|
'name', "EditorCallbackRotate", |
|
'params', "...", |
|
'code', function (self, ...) |
|
AlignedObj.EditorCallbackRotate(self, ...) |
|
AmbientLifeMarker.EditorCallbackRotate(self, ...) |
|
end, |
|
}), |
|
PlaceObj('ClassMethodDef', { |
|
'name', "EditorCallbackScale", |
|
'params', "...", |
|
'code', function (self, ...) |
|
AlignedObj.EditorCallbackScale(self, ...) |
|
AmbientLifeMarker.EditorCallbackScale(self, ...) |
|
end, |
|
}), |
|
PlaceObj('ClassMethodDef', { |
|
'name', "EditorCallbackMove", |
|
'params', "...", |
|
'code', function (self, ...) |
|
AlignedObj.EditorCallbackMove(self, ...) |
|
AmbientLifeMarker.EditorCallbackMove(self, ...) |
|
end, |
|
}), |
|
}) |
|
|
|
PlaceObj('ClassDef', { |
|
DefParentClassList = { |
|
"AmbientLifeMarker", |
|
}, |
|
group = "Ambient Life", |
|
id = "AL_WallLean_NoSnap", |
|
PlaceObj('PropertyDefCombo', { |
|
'category', "Ambient Life", |
|
'id', "VisitEnter", |
|
'name', "Entering Visit", |
|
'default', "civ_Wall_Start", |
|
'items', function (self) return GetStates("Male") end, |
|
}), |
|
PlaceObj('PropertyDefCombo', { |
|
'category', "Ambient Life", |
|
'id', "VisitIdle", |
|
'name', "During Visit", |
|
'default', "civ_Wall_Idle", |
|
'items', function (self) return GetStates("Male") end, |
|
}), |
|
PlaceObj('PropertyDefCombo', { |
|
'category', "Ambient Life", |
|
'id', "VisitExit", |
|
'name', "Exit Visit", |
|
'default', "civ_Wall_End", |
|
'items', function (self) return GetStates("Male") end, |
|
}), |
|
PlaceObj('PropertyDefBool', { |
|
'category', "Ambient Life", |
|
'id', "Teleport", |
|
'name', "Teleport", |
|
}), |
|
PlaceObj('PropertyDefSet', { |
|
'category', "Ambient Life", |
|
'id', "GameStatesFilter", |
|
'name', "States Required for Activation", |
|
'extra_code', "", |
|
'default', set({ |
|
Conflict = false, |
|
}), |
|
'items', function (self) return GetGameStateFilter end, |
|
'three_state', true, |
|
}), |
|
PlaceObj('PropertyDefCombo', { |
|
'category', "Ambient Life", |
|
'id', "EditorMarkerVisitAnim", |
|
'name', "Editor Marker Visit Anim", |
|
'default', "editorMarkerAnim_Wall", |
|
'items', function (self) return GetStates("Male") end, |
|
}), |
|
PlaceObj('ClassConstDef', { |
|
'name', "VisitPose", |
|
'type', "number", |
|
'value', 16, |
|
}), |
|
PlaceObj('ClassConstDef', { |
|
'name', "Appearance", |
|
'type', "text", |
|
'value', "Legion_Jose", |
|
}), |
|
PlaceObj('ClassConstDef', { |
|
'name', "VisitSupportCollectionVME", |
|
'value', true, |
|
}), |
|
PlaceObj('ClassMethodDef', { |
|
'name', "CanVisit", |
|
'params', "unit, for_perpetual, dont_check_dist", |
|
'code', function (self, unit, for_perpetual, dont_check_dist) |
|
local enemy, dist = GetNearestEnemy(unit, "ignore awareness") |
|
if enemy and dist <= const.AmbientLife.ForbidWallLeanEnemyDist then |
|
return false |
|
end |
|
|
|
return AmbientLifeMarker.CanVisit(self, unit, for_perpetual, dont_check_dist) |
|
end, |
|
}), |
|
}) |
|
|
|
PlaceObj('ClassDef', { |
|
DefParentClassList = { |
|
"AmbientLifeMarker", |
|
"GroundAlignedObj", |
|
}, |
|
group = "Ambient Life", |
|
id = "AL_WallLean_Prostitute", |
|
PlaceObj('PropertyDefCombo', { |
|
'category', "Ambient Life", |
|
'id', "VisitEnter", |
|
'name', "Entering Visit", |
|
'default', "", |
|
'items', function (self) return GetStates("Male") end, |
|
}), |
|
PlaceObj('PropertyDefCombo', { |
|
'category', "Ambient Life", |
|
'id', "VisitIdle", |
|
'name', "During Visit", |
|
'default', "civ_Seduce_Wall", |
|
'items', function (self) return GetStates("Male") end, |
|
}), |
|
PlaceObj('PropertyDefCombo', { |
|
'category', "Ambient Life", |
|
'id', "VisitExit", |
|
'name', "Exit Visit", |
|
'default', "", |
|
'items', function (self) return GetStates("Male") end, |
|
}), |
|
PlaceObj('ClassConstDef', { |
|
'name', "VisitPose", |
|
'type', "number", |
|
'value', 3267, |
|
}), |
|
PlaceObj('ClassConstDef', { |
|
'name', "VisitVariation", |
|
'value', true, |
|
}), |
|
PlaceObj('ClassConstDef', { |
|
'name', "Appearance", |
|
'type', "text", |
|
'value', "VillagerFemale_01", |
|
}), |
|
PlaceObj('ClassConstDef', { |
|
'name', "VisitSupportCollectionVME", |
|
'value', true, |
|
}), |
|
PlaceObj('ClassMethodDef', { |
|
'name', "CanVisit", |
|
'params', "unit, for_perpetual, dont_check_dist", |
|
'code', function (self, unit, for_perpetual, dont_check_dist) |
|
if not unit:IsProstitute() then |
|
return false |
|
end |
|
|
|
local enemy, dist = GetNearestEnemy(unit, "ignore awareness") |
|
if enemy and dist <= const.AmbientLife.ForbidWallLeanEnemyDist then |
|
return false |
|
end |
|
|
|
return AmbientLifeMarker.CanVisit(self, unit, for_perpetual, dont_check_dist) |
|
end, |
|
}), |
|
PlaceObj('ClassMethodDef', { |
|
'name', "EditorCallbackPlace", |
|
'params', "...", |
|
'code', function (self, ...) |
|
AlignedObj.EditorCallbackPlace(self, ...) |
|
AmbientLifeMarker.EditorCallbackPlace(self, ...) |
|
end, |
|
}), |
|
PlaceObj('ClassMethodDef', { |
|
'name', "EditorCallbackRotate", |
|
'params', "...", |
|
'code', function (self, ...) |
|
AlignedObj.EditorCallbackRotate(self, ...) |
|
AmbientLifeMarker.EditorCallbackRotate(self, ...) |
|
end, |
|
}), |
|
PlaceObj('ClassMethodDef', { |
|
'name', "EditorCallbackScale", |
|
'params', "...", |
|
'code', function (self, ...) |
|
AlignedObj.EditorCallbackScale(self, ...) |
|
AmbientLifeMarker.EditorCallbackScale(self, ...) |
|
end, |
|
}), |
|
PlaceObj('ClassMethodDef', { |
|
'name', "EditorCallbackMove", |
|
'params', "...", |
|
'code', function (self, ...) |
|
AlignedObj.EditorCallbackMove(self, ...) |
|
AmbientLifeMarker.EditorCallbackMove(self, ...) |
|
end, |
|
}), |
|
}) |
|
|
|
PlaceObj('ClassDef', { |
|
DefParentClassList = { |
|
"AmbientLifeMarker", |
|
}, |
|
group = "Ambient Life", |
|
id = "AL_WeaponAim", |
|
PlaceObj('PropertyDefCombo', { |
|
'category', "Ambient Life", |
|
'id', "VisitEnter", |
|
'name', "Entering Visit", |
|
'default', "", |
|
'items', function (self) return GetStates("Male") end, |
|
}), |
|
PlaceObj('PropertyDefCombo', { |
|
'category', "Ambient Life", |
|
'id', "VisitIdle", |
|
'name', "During Visit", |
|
'default', "ar_Standing_Aim", |
|
'items', function (self) return GetStates("Male") end, |
|
}), |
|
PlaceObj('PropertyDefCombo', { |
|
'category', "Ambient Life", |
|
'id', "VisitExit", |
|
'name', "Exit Visit", |
|
'default', "", |
|
'items', function (self) return GetStates("Male") end, |
|
}), |
|
PlaceObj('ClassConstDef', { |
|
'name', "VisitPose", |
|
'type', "number", |
|
'value', 1912, |
|
}), |
|
PlaceObj('ClassConstDef', { |
|
'name', "VisitVariation", |
|
'value', true, |
|
}), |
|
PlaceObj('PropertyDefCombo', { |
|
'category', "Ambient Life", |
|
'id', "Weapon", |
|
'name', "Weapon", |
|
'extra_code', "", |
|
'default', "DoubleBarrelShotgun", |
|
'items', function (self) return InventoryItemWeaponsCombo end, |
|
}), |
|
PlaceObj('ClassMethodDef', { |
|
'name', "GenerateVisitable", |
|
'code', function (self) |
|
local pos = self:GetPos() |
|
local lookat = pos + Rotate(point(const.SlabSizeX, 0), self:GetAngle()) |
|
|
|
return {self, pos, lookat} |
|
end, |
|
}), |
|
}) |
|
|
|
PlaceObj('ClassDef', { |
|
DefParentClassList = { |
|
"AmbientLifeMarker", |
|
}, |
|
group = "Ambient Life", |
|
id = "AL_WeaponIdle", |
|
PlaceObj('PropertyDefCombo', { |
|
'category', "Ambient Life", |
|
'id', "VisitEnter", |
|
'name', "Entering Visit", |
|
'default', "", |
|
'items', function (self) return GetStates("Male") end, |
|
}), |
|
PlaceObj('PropertyDefCombo', { |
|
'category', "Ambient Life", |
|
'id', "VisitIdle", |
|
'name', "During Visit", |
|
'default', "ar_Standing_Idle", |
|
'items', function (self) return GetStates("Male") end, |
|
}), |
|
PlaceObj('PropertyDefCombo', { |
|
'category', "Ambient Life", |
|
'id', "VisitExit", |
|
'name', "Exit Visit", |
|
'default', "", |
|
'items', function (self) return GetStates("Male") end, |
|
}), |
|
PlaceObj('ClassConstDef', { |
|
'name', "VisitPose", |
|
'type', "number", |
|
'value', 1912, |
|
}), |
|
PlaceObj('ClassConstDef', { |
|
'name', "VisitVariation", |
|
'value', true, |
|
}), |
|
PlaceObj('PropertyDefCombo', { |
|
'category', "Ambient Life", |
|
'id', "Weapon", |
|
'name', "Weapon", |
|
'extra_code', "", |
|
'default', "DoubleBarrelShotgun", |
|
'items', function (self) return InventoryItemWeaponsCombo end, |
|
}), |
|
PlaceObj('ClassMethodDef', { |
|
'name', "GenerateVisitable", |
|
'code', function (self) |
|
local pos = self:GetPos() |
|
local lookat = pos + Rotate(point(const.SlabSizeX, 0), self:GetAngle()) |
|
|
|
return {self, pos, lookat} |
|
end, |
|
}), |
|
}) |
|
|
|
|