501 lines
12 KiB
Lua
501 lines
12 KiB
Lua
|
if r2.Utils == nil
|
|||
|
then
|
|||
|
r2.Utils={}
|
|||
|
end
|
|||
|
|
|||
|
|
|||
|
r2.Utils.addReaction = function(this,event,action)
|
|||
|
local reactions = this.Reactions[event]
|
|||
|
if reactions == nil
|
|||
|
then
|
|||
|
reactions = {}
|
|||
|
this.Reactions[event]=reactions
|
|||
|
end
|
|||
|
table.insert(reactions,action)
|
|||
|
end
|
|||
|
|
|||
|
------------------------------------------------------
|
|||
|
--Create the states and groups to represent:
|
|||
|
-- -A counter mission
|
|||
|
-- -The counters used for this mission
|
|||
|
r2.Utils._obsolete_initCounterStates = function(counter,context)
|
|||
|
|
|||
|
if counter.Class =="Counter"
|
|||
|
then
|
|||
|
|
|||
|
local pGroup = r2.createPseudoGroup(context)
|
|||
|
context.RtCounters[counter.InstanceId]=pGroup
|
|||
|
|
|||
|
for k,v in pairs(counter.Counters)
|
|||
|
do
|
|||
|
Translator.LogicEntityTranslator(v,context)
|
|||
|
end
|
|||
|
end
|
|||
|
end
|
|||
|
|
|||
|
|
|||
|
r2.Utils.createGroup = function(x,y,n,base,name,mode)
|
|||
|
|
|||
|
if mode == nil
|
|||
|
then
|
|||
|
mode = "circle"
|
|||
|
end
|
|||
|
|
|||
|
local isGeneric = false
|
|||
|
|
|||
|
if string.find(base, "palette.entities.players.") ~= nil then
|
|||
|
isGeneric = true
|
|||
|
end
|
|||
|
|
|||
|
|
|||
|
local npcGroup = r2.newComponent("NpcGrpFeature")
|
|||
|
assert(npcGroup)
|
|||
|
npcGroup.Name = name
|
|||
|
|
|||
|
if mode == "circle"
|
|||
|
then
|
|||
|
|
|||
|
local pas = (2 * math.pi)/n
|
|||
|
local r = (n/(2*math.pi))+2
|
|||
|
for i=1,n do
|
|||
|
local npc = nil
|
|||
|
if ( isGeneric == true) then
|
|||
|
npc = r2.newComponent("NpcCustom")
|
|||
|
else
|
|||
|
npc = r2.newComponent("Npc")
|
|||
|
end
|
|||
|
|
|||
|
npc.Name = name.."_".."Npc"..i
|
|||
|
npc.Base = base
|
|||
|
npc.Position.x = x + (r-1) * math.cos((i-1)*pas)
|
|||
|
npc.Position.y = y + (r-1) * math.sin((i-1)*pas)
|
|||
|
npc.Position.z = r2:snapZToGround(npc.Position.x, npc.Position.y)
|
|||
|
npc.Angle = (i-1)*pas + math.pi
|
|||
|
table.insert(npcGroup.Components,npc)
|
|||
|
end
|
|||
|
end
|
|||
|
if mode == "line"
|
|||
|
then
|
|||
|
local pas = 1
|
|||
|
for i=1,n do
|
|||
|
local npc = r2.newComponent("Npc")
|
|||
|
npc.Name = name.."_".."Npc"..i
|
|||
|
npc.Base = base
|
|||
|
npc.Position.x = x + i * pas
|
|||
|
npc.Position.y = y
|
|||
|
npc.Position.z = r2:snapZToGround(npc.Position.x, npc.Position.y)
|
|||
|
npc.Angle = 0
|
|||
|
table.insert(npcGroup.Components,npc)
|
|||
|
end
|
|||
|
end
|
|||
|
return npcGroup
|
|||
|
end
|
|||
|
|
|||
|
--region = region to fill
|
|||
|
--x,y = region's center
|
|||
|
--r = region's ray
|
|||
|
--nbPoints = number of points to create the region
|
|||
|
r2.Utils.createRegion = function(region,x, y, r,nbPoints)
|
|||
|
region.Points = {}
|
|||
|
local tmpPositions = region.Points
|
|||
|
local pas = (2 * math.pi)/nbPoints
|
|||
|
local Angle = 0
|
|||
|
while nbPoints ~= 0
|
|||
|
do
|
|||
|
local tmpVertex = r2.newComponent("RegionVertex")
|
|||
|
local tmpPosition = r2.newComponent("Position")
|
|||
|
local sx, sy, sz
|
|||
|
sx = x + r * math.cos(Angle)
|
|||
|
sy = y + r * math.sin(Angle)
|
|||
|
sx, sy, sz = r2:snapPosToGround(sx, sy)
|
|||
|
tmpPosition.x = sx
|
|||
|
tmpPosition.y = sy
|
|||
|
tmpPosition.z = sz
|
|||
|
tmpVertex.Position = tmpPosition
|
|||
|
table.insert(tmpPositions, tmpVertex)
|
|||
|
Angle = Angle + pas
|
|||
|
nbPoints = nbPoints - 1
|
|||
|
end
|
|||
|
end
|
|||
|
|
|||
|
--region = region to fill
|
|||
|
--x,y = region's center
|
|||
|
--r = region's ray
|
|||
|
--nbPoints = number of points to create the region
|
|||
|
r2.Utils.createNonDeleteableRegion = function(region,x, y, r,nbPoints)
|
|||
|
region.Deletable = 0
|
|||
|
region.Points = {}
|
|||
|
local tmpPositions = region.Points
|
|||
|
local pas = (2 * math.pi)/nbPoints
|
|||
|
local Angle = 0
|
|||
|
while nbPoints ~= 0
|
|||
|
do
|
|||
|
local tmpVertex = r2.newComponent("RegionVertex")
|
|||
|
tmpVertex.Deletable = 0
|
|||
|
local tmpPosition = r2.newComponent("Position")
|
|||
|
local sx, sy, sz
|
|||
|
sx = x + r * math.cos(Angle)
|
|||
|
sy = y + r * math.sin(Angle)
|
|||
|
sx, sy, sz = r2:snapPosToGround(sx, sy)
|
|||
|
tmpPosition.x = sx
|
|||
|
tmpPosition.y = sy
|
|||
|
tmpPosition.z = sz
|
|||
|
tmpVertex.Position = tmpPosition
|
|||
|
table.insert(tmpPositions, tmpVertex)
|
|||
|
Angle = Angle + pas
|
|||
|
nbPoints = nbPoints - 1
|
|||
|
end
|
|||
|
end
|
|||
|
|
|||
|
--region = trigger Zone
|
|||
|
--x,y = region's center
|
|||
|
--r = region's ray
|
|||
|
--nbPoints = number of points to create the region
|
|||
|
r2.Utils.createTriggerRegion = function(region,x, y, r)
|
|||
|
return r2.Utils.createNonDeleteableRegion(region, x, y, r, 4)
|
|||
|
end
|
|||
|
|
|||
|
|
|||
|
|
|||
|
-- Create a Road
|
|||
|
-- ex local road = createRoad("rout1", { {21570, -1363}, {21570, -1363}, {21570, -1363})
|
|||
|
r2.Utils.createRoute = function(name, positions)
|
|||
|
local road = r2.newComponent("Road")
|
|||
|
local function wp(x, y, z)
|
|||
|
local wayPoint = r2.newComponent("WayPoint")
|
|||
|
local pos = r2.newComponent("Position")
|
|||
|
pos.x = x
|
|||
|
pos.y = y
|
|||
|
pos.z = z
|
|||
|
wayPoint.Position = pos
|
|||
|
return wayPoint
|
|||
|
end
|
|||
|
|
|||
|
-- road.Base = "palette.geom.road"
|
|||
|
road.Name = name
|
|||
|
local tmpPositions = road.Points -- depart a arriv<69>e
|
|||
|
|
|||
|
for index, points in pairs(positions)
|
|||
|
do
|
|||
|
table.insert(tmpPositions, wp(points[1], points[2], 0))
|
|||
|
end
|
|||
|
|
|||
|
return road
|
|||
|
end
|
|||
|
|
|||
|
|
|||
|
--function to set an RtAiState with a npc's behavior
|
|||
|
r2.Utils.setState = function(context,behavior,rtAiState)
|
|||
|
local aiMovement = behavior.Type
|
|||
|
rtAiState.Name = rtAiState.Id .. "|" .. aiMovement
|
|||
|
rtAiState.AiMovement = aiMovement
|
|||
|
if (aiMovement == "wander" or aiMovement == "follow_route" or aiMovement == "patrol_route" or aiMovement == "repeat_road") then
|
|||
|
local id = behavior.ZoneId
|
|||
|
local zone = context.Components[id]
|
|||
|
assert( zone ~= nil)
|
|||
|
local points=zone.Points
|
|||
|
assert( points ~= nil)
|
|||
|
local size = table.getn(points)
|
|||
|
rtAiState.Pts = {}
|
|||
|
local k,v = next(points, nil)
|
|||
|
local i = 0
|
|||
|
while k ~= nil
|
|||
|
do
|
|||
|
if (k ~= "Keys")
|
|||
|
then
|
|||
|
-- replacement for getworldPos
|
|||
|
assert(v ~= nil)
|
|||
|
i = i +1
|
|||
|
rtAiState.Pts[i] = {}
|
|||
|
-- ??? v.Position.x ??
|
|||
|
rtAiState.Pts[i].x = r2.getWorldPos(v).x
|
|||
|
rtAiState.Pts[i].y = r2.getWorldPos(v).y
|
|||
|
rtAiState.Pts[i].z = r2.getWorldPos(v).z
|
|||
|
end
|
|||
|
k,v = next(points, k)
|
|||
|
end
|
|||
|
-- do reverse
|
|||
|
if (aiMovement == "patrol_route") then
|
|||
|
i = 0
|
|||
|
for i = 1, size -1 , 1
|
|||
|
do
|
|||
|
local first = size - i
|
|||
|
local last = size + i
|
|||
|
|
|||
|
rtAiState.Pts[last] = {}
|
|||
|
rtAiState.Pts[last].x = rtAiState.Pts[first].x
|
|||
|
rtAiState.Pts[last].y = rtAiState.Pts[first].y
|
|||
|
rtAiState.Pts[last].z = rtAiState.Pts[first].z
|
|||
|
end
|
|||
|
end
|
|||
|
if (aiMovement == "patrol_route" or aiMovement == "repeat_road") then
|
|||
|
rtAiState.AiMovement = "follow_route"
|
|||
|
local eventHandler = Actions.createEvent("destination_reached", rtAiState.Id ,"")
|
|||
|
assert( eventHandler ~= nil)
|
|||
|
local eName = rtAiState.Id .. ":destination_reached"
|
|||
|
eventHandler.Name=eName
|
|||
|
table.insert(context.RtAct.Events,eventHandler)
|
|||
|
|
|||
|
local action = Actions.createAction("begin_state", rtAiState.Id)
|
|||
|
action.Name="begin state " .. rtAiState.Id
|
|||
|
table.insert(context.RtAct.Actions,action)
|
|||
|
table.insert(eventHandler.ActionsId,action.Id)
|
|||
|
end
|
|||
|
end
|
|||
|
end
|
|||
|
|
|||
|
|
|||
|
r2.Utils.invertRoad = function(road)
|
|||
|
local road2 = r2.newComponent("Road")
|
|||
|
local function wp(x, y, z)
|
|||
|
local wayPoint = r2.newComponent("WayPoint")
|
|||
|
local pos = r2.newComponent("Position")
|
|||
|
pos.x = x
|
|||
|
pos.y = y
|
|||
|
pos.z = z
|
|||
|
wayPoint.Position = pos
|
|||
|
return wayPoint
|
|||
|
end
|
|||
|
local max = table.getn(road.Points)
|
|||
|
|
|||
|
for i=1,max do
|
|||
|
local point = road.Points[max-i+1].Position
|
|||
|
table.insert(road2.Points,wp(point.x,point.y,point.z))
|
|||
|
end
|
|||
|
return road2
|
|||
|
end
|
|||
|
|
|||
|
|
|||
|
r2.Utils.createEntry = function(who,states,event,actions)
|
|||
|
local entry = r2.newComponent("EventHandlerEntry")
|
|||
|
entry.Who = who
|
|||
|
entry.States = states
|
|||
|
entry.Event = event
|
|||
|
entry.Actions = actions
|
|||
|
return entry
|
|||
|
end
|
|||
|
|
|||
|
r2.Utils.createPlace = function(x,y,z,r)
|
|||
|
local place = r2.newComponent("Place")
|
|||
|
place.Position.x=x
|
|||
|
place.Position.y=y
|
|||
|
place.Position.z=z
|
|||
|
place.Radius = r
|
|||
|
return place
|
|||
|
end
|
|||
|
|
|||
|
r2.Utils.searchEntry = function(activity,who,event,state)
|
|||
|
local max = table.getn(activity.Entries)
|
|||
|
for i=1, max do
|
|||
|
local entry = activity.Entries[i]
|
|||
|
if entry.Who==who and entry.Event == event and (entry.States == state or state=="")
|
|||
|
then
|
|||
|
return entry
|
|||
|
end
|
|||
|
end
|
|||
|
return nil
|
|||
|
end
|
|||
|
|
|||
|
r2.Utils.groupActivities = function(activity1,activity2,event1,state1,event2,state2)
|
|||
|
local entry
|
|||
|
entry = r2.Utils.searchEntry(activity1,activity1.Entries[1].Who,event1,state1)
|
|||
|
|
|||
|
if entry == nil
|
|||
|
then
|
|||
|
entry = r2.Utils.createEntry(activity1.Entries[1].Who,state1,event1,"begin_state\n"..state2)
|
|||
|
table.insert(activity1.Entries,entry)
|
|||
|
else
|
|||
|
entry.Actions = entry.Actions .. "\nbegin_state\n"..state2
|
|||
|
end
|
|||
|
|
|||
|
entry = r2.Utils.searchEntry(activity2,activity2.Entries[1].Who,event2,state2)
|
|||
|
if entry == nil
|
|||
|
then
|
|||
|
entry = r2.Utils.createEntry(activity2.Entries[1].Who,state2,event2,"begin_state\n"..state1)
|
|||
|
table.insert(activity2.Entries,entry)
|
|||
|
else
|
|||
|
entry.Actions = entry.Actions .. "\nbegin_state\n"..state
|
|||
|
end
|
|||
|
end
|
|||
|
|
|||
|
r2.Utils.evalCost = function(feature)
|
|||
|
--luaObject(feature)
|
|||
|
local components = feature.Components
|
|||
|
--luaObject(components)
|
|||
|
local cost = 0
|
|||
|
if components ~= nil
|
|||
|
then
|
|||
|
for key,comp in pairs(components)
|
|||
|
do
|
|||
|
if key~="Keys" and comp.Class == "Npc"
|
|||
|
then
|
|||
|
cost = cost + 1
|
|||
|
end
|
|||
|
end
|
|||
|
end
|
|||
|
return cost
|
|||
|
end
|
|||
|
|
|||
|
r2.Utils.createChatAction = function(who,says,emote,face)
|
|||
|
local chatStep
|
|||
|
|
|||
|
chatStep = r2.newComponent("ChatAction")
|
|||
|
chatStep.Who = who
|
|||
|
|
|||
|
if says ~= ""
|
|||
|
then
|
|||
|
local entry=r2.registerText(says)
|
|||
|
chatStep.Says = entry.InstanceId
|
|||
|
else
|
|||
|
chatStep.Says = says
|
|||
|
end
|
|||
|
|
|||
|
if face ~="" and face ~=nil
|
|||
|
then
|
|||
|
chatStep.Facing = face
|
|||
|
end
|
|||
|
|
|||
|
chatStep.Emote = emote
|
|||
|
return chatStep
|
|||
|
end
|
|||
|
|
|||
|
|
|||
|
|
|||
|
--replace each instanceId in the table by the new one
|
|||
|
r2.Utils.replaceTab = function(this,ttable)
|
|||
|
for k,v in pairs(this)
|
|||
|
do
|
|||
|
if k ~="Keys"
|
|||
|
then
|
|||
|
this[k]=ttable[this[k]]
|
|||
|
end
|
|||
|
end
|
|||
|
end
|
|||
|
--call the replace function for each object in the table
|
|||
|
r2.Utils.callReplace = function(this,ttable)
|
|||
|
for k,v in pairs(this)
|
|||
|
do
|
|||
|
if k ~="Keys"
|
|||
|
then
|
|||
|
v:replace(ttable)
|
|||
|
end
|
|||
|
end
|
|||
|
end
|
|||
|
|
|||
|
|
|||
|
r2.Utils.changeRepere = function(position,center)
|
|||
|
position.x=position.x - center.x
|
|||
|
position.y=position.y - center.y
|
|||
|
position.z = r2:snapZToGround(position.x,position.y)
|
|||
|
end
|
|||
|
|
|||
|
r2.Utils.changeZoneRepere = function(zone,center)
|
|||
|
for i=1,table.getn(zone.Points)
|
|||
|
do
|
|||
|
r2.Utils.changeRepere(zone.Points[i])
|
|||
|
end
|
|||
|
end
|
|||
|
|
|||
|
r2.Utils.changeRepereRt = function(npc,center)
|
|||
|
local x,y
|
|||
|
local position = npc.Position
|
|||
|
x = position.x - center.x
|
|||
|
y = position.y - center.y
|
|||
|
r2.requestSetNode(position.InstanceId,"x",x)
|
|||
|
r2.requestSetNode(position.InstanceId,"y",y)
|
|||
|
r2.requestSetNode(position.InstanceId,"z",r2:snapZToGround(x,y))
|
|||
|
end
|
|||
|
|
|||
|
r2.Utils.setNewGroupCenter = function(group,x,y)
|
|||
|
local k,v = next(group.Components,nil)
|
|||
|
local center = r2.newComponent("Position")
|
|||
|
local first = true
|
|||
|
center.x = x
|
|||
|
center.y = y
|
|||
|
|
|||
|
while k~=nil
|
|||
|
do
|
|||
|
if first == true
|
|||
|
then
|
|||
|
first = false
|
|||
|
local newCenter = {}
|
|||
|
newCenter.x = -(center.x - v.Position.x)
|
|||
|
newCenter.y = -(center.y - v.Position.y)
|
|||
|
center.z = r2:snapZToGround(center.x,center.y)
|
|||
|
r2.requestSetNode(v.Position.InstanceId,"x",center.x)
|
|||
|
r2.requestSetNode(v.Position.InstanceId,"y",center.y)
|
|||
|
r2.requestSetNode(v.Position.InstanceId,"z",r2:snapZToGround(center.x,center.y))
|
|||
|
center = newCenter
|
|||
|
else
|
|||
|
r2.Utils.changeRepereRt(v,center)
|
|||
|
end
|
|||
|
k,v = next(group.Components,k)
|
|||
|
end
|
|||
|
|
|||
|
end
|
|||
|
|
|||
|
-- Obsolete
|
|||
|
r2.Utils.getRtGroup = function(context,instanceId)
|
|||
|
debugInfo("Call obsolete function: call r2.Translator.getRtGroup")
|
|||
|
-- use r2.Translator.getRtGroup instead
|
|||
|
return r2.Translator.getRtGroup(context, instanceId)
|
|||
|
end
|
|||
|
|
|||
|
r2.Utils.concat = function(text,textSup)
|
|||
|
if text == ""
|
|||
|
then
|
|||
|
return textSup
|
|||
|
else
|
|||
|
return text.."\n"..textSup
|
|||
|
end
|
|||
|
end
|
|||
|
|
|||
|
|
|||
|
-----------------------------------------------------------
|
|||
|
--return a string like: "group1:Npc1" for use with actions
|
|||
|
r2.Utils.getNpcParam = function(npcId, context)
|
|||
|
|
|||
|
assert( type(npcId) == "string")
|
|||
|
local who = r2:getInstanceFromId(tostring(npcId))
|
|||
|
-- local group = who:getParentGroup()
|
|||
|
local rtNpcGrp = context.RtGroups[tostring(npcId)]
|
|||
|
if rtNpcGrp == nil
|
|||
|
then
|
|||
|
debugInfo("Err: unable to know the npc's group name ("..npcId..")")
|
|||
|
return nil
|
|||
|
end
|
|||
|
|
|||
|
return rtNpcGrp.Name..":"..tostring(who.Name)
|
|||
|
end
|
|||
|
|
|||
|
|
|||
|
--
|
|||
|
-- Returns the RtNpcGrp Id for a given instanceId
|
|||
|
--
|
|||
|
r2.Utils.getRtIdFromInstanceId = function(context, instanceId)
|
|||
|
assert(instanceId ~= nil and type(instanceId) == "string")
|
|||
|
local instance = r2:getInstanceFromId(instanceId)
|
|||
|
assert(instance)
|
|||
|
return context.RtGroups[instanceId].Id
|
|||
|
end
|
|||
|
|
|||
|
|
|||
|
-- vianney tests
|
|||
|
function r2.testVianney1()
|
|||
|
r2.requestStartAct(1)
|
|||
|
end
|
|||
|
|
|||
|
function r2.testVianney2()
|
|||
|
r2.requestStartAct(2)
|
|||
|
end
|
|||
|
|
|||
|
function r2.testVianney3()
|
|||
|
r2.requestStopAct()
|
|||
|
end
|
|||
|
|
|||
|
function r2:lowerTranslate(uiR2EdStr)
|
|||
|
return string.lower(i18n.get(uiR2EdStr):toUtf8())
|
|||
|
end
|
|||
|
|
|||
|
|