khanat-opennel-code/code/ryzom/common/data_common/r2/r2_environment.lua
2017-03-15 20:29:34 +01:00

203 lines
6.4 KiB
Lua

-- main tables of environement & general editor functions
---------------
-- FUNCTIONS --
---------------
------------------------------------------------------------------------------------------------------------
-- Helper : eval a property in an instance of a class :
-- if the property is a value, then that value is returned
-- if the property is a function, then the 'this' parameter is passed to the function and the result is returned
-- if the property is nil, then the defualt value is returned
function r2:evalProp(prop, this, defaultValue)
if type(prop) == "function" then return prop(this) -- could have been this:prop(), too...
elseif prop ~= nil then return prop
else return defaultValue
end
end
-------------------------------------------------------------------------------------
-- get translation id for a property, followed by a boolean (false if not found)
function r2:getPropertyTranslationId(prop)
local translationId
local found = true
if prop.Translation ~= nil then
translationId = prop.Translation
elseif i18n.hasTranslation('uiR2EDProp_' .. prop.Name) then
translationId = 'uiR2EDProp_' .. prop.Name
elseif i18n.hasTranslation('uiR2ED' .. prop.Name) then
translationId = 'uiR2ED' .. prop.Name
else
translationId = prop.Name
found = false
end
return translationId, found
end
-------------------------------------------------------------------------------------
-- get translation id for a property, as an ucstring
function r2:getPropertyTranslation(prop)
local translationId = r2:getPropertyTranslationId(prop)
if (i18n.hasTranslation(translationId)) then
return i18n.get(translationId)
else
return ucstring(translationId)
end
end
------------------------------------------------------------------------------------------------------------
-- return the left quota for the current scenario (called by C++)
function r2:getLeftQuota()
return r2.ScenarioWindow:getLeftQuota()
end
------------------------------------------------------------------------------------------------------------
-- retrieve class description of an instance (in the r2.Classes table)
function r2:getClass(instance)
if instance == nil or instance.isNil then
debugInfo("Calling r2:getClass on nil instance")
debugInfo(debug.traceback())
return
end
if instance.Class == nil then
debugInfo("Calling r2:getClass on class with no 'Class' field")
debugInfo(debug.traceback())
return
end
return r2.Classes[instance.Class]
end
------------------------------------------------------------------------------------------------------------
-- get parent instance of an object in the editor (that is an object with an InstanceId)
function r2:getParentInstance(object)
debugInfo(debug.traceback())
assert(nil) -- deprecated : use special member 'ParentInstance' instead
--if object == nil then return nil end
--local parent = object.Parent
--while parent ~= nil do
-- if parent.InstanceId ~= nil then
-- return parent
-- end
-- parent = parent.Parent
--end
--return nil
end
------------------------------------------------------------------------------------------------------------
-- get max number of acts in a scenario
function r2:getMaxNumberOfAdditionnalActs()
return getDefine("r2ed_max_num_additionnal_acts")
end
------------------------------------------------------------------------------------------------------------
-- Explore a tree of instance, each instance that has a sheet id is append to the list
function r2:exploreInstanceTree(obj, destTable)
if obj.InstanceId ~= nil then
table.insert(destTable, obj)
end
for k, v in specPairs(obj) do
if type(v) == "userdata" and v.Size ~= nil then
-- this is a sub array
r2:exploreInstanceTree(v, destTable)
end
end
end
-- test from a sheet id if an object is a bot object
function r2:isBotObject(sheetClient)
return getCharacterSheetSkel(sheetClient, false) == ""
or string.match(sheetClient, "object_[%w_]*%.creature") -- patch for bot objects (with skeletons -> wind turbine)
end
-- helper function for pasting : relocate the 'Position' field of 'dest' for proper pasting
function r2:relocatePos(dest)
local x, y, z = r2:findEmptyPlace(dest.Position.x, dest.Position.y)
if x ~= nil then
dest.Position.x = x
dest.Position.y = y
dest.Position.z = z
end
end
-- Get a new position were to paste an object
function r2:getPastePosition()
local x, y, z = r2:getUserEntityPosition()
local fx, fy = r2:getUserEntityFront()
x = x + fx * 4
y = y + fy * 4
x = x + 3 * math.random(-100, 100) / 100
y = y + 3 * math.random(-100, 100) / 100
local nx, ny = r2:findEmptyPlace(x, y)
if nx ~= nil then
return nx, ny, z
else
return r2:getUserEntityPosition() -- no empty place found, paste on user
end
end
------------------------------------------------------------------------------------------------------------------
--------------------
-- INIT / GLOBALS --
--------------------
--debugInfo("Initializing main tables")
if r2 == nil then
r2 = {} -- for vianney's tests (is initialized by the caller otherwise)
end
------------------
-- MISC GLOBALS --
------------------
r2.ScratchUCStr = ucstring() -- scratch ucstring, useful to do call from utf8 without to create a new object
---------------------
-- EDITION GLOBALS --
---------------------
r2.maxId = {}
-- define in r2_features.lua
r2.Features={}
-- define in r2_basic_bricks.lua
r2.BasicBricks = {}
-- define in r2_palette.lua
r2.Palette = {}
-- definition of all R2 classes (contains both basic components and components of features)
r2.Classes = {}
-- current content of the clipboard after the selection has been copied
r2.ClipBoard = nil
r2.ClipBoardSrcInstanceId = nil
r2.ClipBoardDisplayName = nil
-----------------------
-- ANIMATION GLOBALS --
-----------------------
-- contains var related to animation
r2.AnimGlobals =
{
Acts = nil, -- set to nil until received by server, contains
-- the list of acts accessible at runtime by the animator
UserTriggers = nil, -- set to nil until received by server, contains
-- the list of triggers that an animator can fire at runtime
-------------------------------------------------------------------------------------
reset = function(this)
this.Acts = nil
this.UserTriggers = nil
end
}