myspace / CommonLua /Classes /EntityClass.lua
sirnii's picture
Upload 1816 files
b6a38d7 verified
raw
history blame
6 kB
if Platform.ged then
DefineClass("EntityClass", "CObject")
return
end
DefineClass.EntityClass = {
flags = { efCameraRepulse = true, efSelectable = false },
__hierarchy_cache = true,
__parents = { "CObject" },
}
local detail_flags = {
["Default"] = { gofDetailClass0 = false, gofDetailClass1 = false },
["Essential"] = { gofDetailClass0 = false, gofDetailClass1 = true },
["Optional"] = { gofDetailClass0 = true, gofDetailClass1 = false },
["Eye Candy"] = { gofDetailClass0 = true, gofDetailClass1 = true },
}
function CopyDetailFlagsFromEntity(class, entity, name)
local detail_class = entity and entity.DetailClass or "Essential"
local flags = detail_flags[detail_class]
if class.flags then
for k, v in pairs(flags or empty_table) do
class.flags[k] = v
end
else
class.flags = flags
end
end
function OnMsg.ClassesGenerate(classdefs)
local all_entities = GetAllEntities()
local EntityData = EntityData
local CopyDetailFlagsFromEntity = CopyDetailFlagsFromEntity
local UseCameraCollision = not config.NoCameraCollision
local UseColliders = const.maxCollidersPerObject > 0
for name in pairs(EntityData) do
all_entities[name] = true
end
for name, class in pairs(classdefs) do
local entity = class.entity or name
local cls_data = entity and (EntityData[entity] or empty_table).entity
for id, value in pairs(cls_data) do
if not rawget(class, id) and id ~= "class_parent" then
class[id] = value
end
end
local flags = class.flags
if not flags or flags.gofDetailClass0 == nil and flags.gofDetailClass1 == nil then
CopyDetailFlagsFromEntity(class, cls_data, name)
end
all_entities[name] = nil -- exclude used entities
if rawget(class, "prevent_entity_class_creation") then
all_entities[entity or false] = nil
end
end
all_entities["StatesSpots"] = nil
all_entities["error"] = nil
all_entities[""] = nil
local __parent_tables = { }
for name in pairs(all_entities) do
local entity_data = EntityData[name]
local cls_data = entity_data and entity_data.entity
local class = cls_data and table.copy(cls_data) or { }
local parent = class.class_parent or "EntityClass"
if parent ~= "NoClass" then
class.class_parent = nil
local __parents = __parent_tables[parent]
if not __parents then
if parent ~= "EntityClass" and parent:find(",") then
__parents = string.split(parent, "[^%w]+")
table.remove_value(__parents, "")
else
__parents = { parent }
end
__parent_tables[parent] = __parents
end
class.__parents = __parents
CopyDetailFlagsFromEntity(class, cls_data, name)
if UseCameraCollision then
local entity_occ = cls_data and cls_data.on_collision_with_camera or "no action"
local occ_flags = OCCtoFlags[entity_occ]
if occ_flags then
if class.flags then
for k, v in pairs(occ_flags) do
class.flags[k] = v
end
else
class.flags = occ_flags
end
end
end
if UseColliders and IsValidEntity(name) and not HasColliders(name) then
class.flags = class.flags and table.copy(class.flags) or {}
class.flags.cofComponentCollider = false
end
class.entity = false
class.__generated_by_class = "EntityClass"
classdefs[name] = class
end
end
Msg("BeforeClearEntityData") -- game specific hook to give the game the chance to do something with the entities
MsgClear("BeforeClearEntityData")
CreateRealTimeThread(ReloadFadeCategories, true)
end
function ReloadFadeCategories(apply_to_objects)
if const.UseDistanceFading and rawget(_G, "EntityData") then
for name,entity_data in pairs(EntityData) do
local fade = FadeCategories[entity_data.entity and entity_data.entity.fade_category or false]
SetEntityFadeDistances(name, fade and fade.min or 0, fade and fade.max or 0)
end
if apply_to_objects and __cobjectToCObject then
MapForEach("map", function(x)
x:GenerateFadeDistances()
end)
end
end
end
AnimatedTextureObjectTypes = {
{ value = pbo.Normal, text = "Normal" },
{ value = pbo.PingPong, text = "Ping-Pong" },
}
DefineClass.AnimatedTextureObject =
{
__parents = { "ComponentCustomData", "Object" },
properties = {
{ category = "Animated Texture", id = "anim_type", name = "Pick frame by", editor = "choice", items = function() return AnimatedTextureObjectTypes end, template = true },
{ category = "Animated Texture", id = "anim_speed", name = "Speed Multiplier", editor = "number", max = 4095, min = 0, template = true },
{ category = "Animated Texture", id = "sequence_time_remap", name = "Sequence time", editor = "curve4", max = 63, scale = 63, max_x = 15, scale_x = 15, template = true },
},
anim_type = pbo.Normal,
anim_speed = 1000,
sequence_time_remap = MakeLine(0, 63, 15),
}
function AnimatedTextureObject:Setanim_type(value)
self:SetFrameAnimationPlaybackOrder(value)
end
function AnimatedTextureObject:Getanim_type()
return self:GetFrameAnimationPlaybackOrder()
end
function AnimatedTextureObject:Setanim_speed(value)
self:SetFrameAnimationSpeed(value)
end
function AnimatedTextureObject:Getanim_speed()
return self:GetFrameAnimationSpeed()
end
function AnimatedTextureObject:Setsequence_time_remap(curve)
local value = (curve[1]:y()) |
(curve[2]:y() << 6) |
(curve[3]:y() << 12) |
(curve[4]:y() << 18) |
(curve[2]:x() << 24) |
(curve[3]:x() << 28)
self:SetFrameAnimationPackedCurve(value)
end
function AnimatedTextureObject:Getsequence_time_remap()
local value = self:GetFrameAnimationPackedCurve()
local curve = {
point(0, value & 0x3F),
point((value >> 24) & 0xF, (value >> 6) & 0x3F),
point((value >> 28) & 0xF, (value >> 12) & 0x3F),
point(15, (value >> 18) & 0x3F),
}
for i = 1, 4 do
curve[i] = point(curve[i]:x(), curve[i]:y(), curve[i]:y())
end
return curve
end
function AnimatedTextureObject:Init()
self:InitTextureAnimation()
self:Setanim_type(self.anim_type)
self:Setanim_speed(self.anim_speed)
self:Setsequence_time_remap(self.sequence_time_remap)
end