2025-06-04 05:02:57 +08:00

226 lines
6.0 KiB
Plaintext

-- autoImport('EffectAndAudioForInteractionGrass_NoAppropriate')
autoImport('LuaFarmland')
autoImport('LuaRolesOnCurrentMap')
autoImport('Debug_LuaMemotry')
autoImport('ArrayUtil')
autoImport('LuaDynamicGrass')
FunctionInteractionGrass = class("FunctionInteractionGrass")
local reusableLuaVector3 = LuaVector3.New()
local reusableArray1 = {}
local reusableArray2 = {}
local poolLuaVector3 = {}
local IsNull = Slua.IsNull
function FunctionInteractionGrass.GetLuaVector3()
local retVec3 = nil
local retIndex = 0
for k, v in pairs(poolLuaVector3) do
local vec3Container = v
if not vec3Container.vec3IsBusy then
retVec3 = vec3Container.vec3
retIndex = k
vec3Container.vec3IsBusy = true
break
end
end
if retVec3 == nil then
local luaVector3 = LuaVector3.zero
local vec3Container = {
vec3IsBusy = true,
vec3 = luaVector3
}
table.insert(poolLuaVector3, vec3Container)
retVec3 = luaVector3
retIndex = #poolLuaVector3
end
return retVec3, retIndex
end
function FunctionInteractionGrass.BackLuaVector3(lua_vector3_index)
local vec3Container = poolLuaVector3[lua_vector3_index]
vec3Container.isBusy = false
vec3Container.vec3:Set(0, 0, 0)
end
FunctionInteractionGrass.ins = nil
function FunctionInteractionGrass.Ins()
if FunctionInteractionGrass.ins == nil then
FunctionInteractionGrass.ins = FunctionInteractionGrass.new()
end
return FunctionInteractionGrass.ins
end
function FunctionInteractionGrass:Open()
if self.tick == nil then
self.tickID = 1
self.tick = TimeTickManager.Me():CreateTick(0, 100, self.OnTick, self, self.tickID)
end
if self.farmlandManager == nil then
self.farmlandManager = LuaFarmlandManager.Ins()
self.farmlandManager:Initialize()
end
-- {
-- [1] = { -- player id
-- pos = LuaVector3.zero, -- position
-- previousFarmland = 1, -- previous farmland
-- isLeaveFromPreviousFarmland = false,
-- farmland = 1 -- farmland
-- }
-- }
if self.cachedPlayersOnFarmlands == nil then
self.cachedPlayersOnFarmlands = {}
end
-- self:ListenSceneBeLoaded()
-- EffectAndAudioForInteractionGrass_NoAppropriate.Instance():Open()
self:Listen()
end
function FunctionInteractionGrass:Close()
if self.tick ~= nil then
TimeTickManager.Me():ClearTick(self, self.tickID)
end
self:Release()
-- EffectAndAudioForInteractionGrass_NoAppropriate.Instance():Close()
self:CancelListen()
end
function FunctionInteractionGrass:OnTick()
if not self:IsExistAnyFarmland() then
return
end
-- 1.handle Myself
self:_HandleCreature(Game.Myself)
-- 2.handle Players
local users = NSceneUserProxy.Instance.userMap
for k,v in pairs(users) do
self:_HandleCreature(v)
end
-- 3.can handle npcs
end
function FunctionInteractionGrass:_HandleCreature(creature)
local pos = creature:GetPosition()
local creatureID= creature.data.id
local handled = false
local farmlandManager = self.farmlandManager
for i = 1, #farmlandManager.cachedFarmlands do
local luaFarmland = farmlandManager.cachedFarmlands[i]
-- if not IsNull(luaFarmland.csfarmland) then
if(handled==false) then
if(luaFarmland:IsPointInside(pos)) then
farmlandManager:CreatureIn(luaFarmland,creatureID,pos)
if(not farmlandManager:GetOverlap()) then
handled = true
end
if(creature:IsMoving()) then
--handle moving
farmlandManager:TryHandleCreatureMoving(luaFarmland,creatureID,pos)
else
--handle idle
-- farmlandManager:TryHandleCreatureIdle(luaFarmland,creatureID)
end
else
farmlandManager:TryHandleCreatureLeaving(luaFarmland,creatureID)
end
else
farmlandManager:TryHandleCreatureLeaving(luaFarmland,creatureID)
end
-- end
end
end
function FunctionInteractionGrass:IsExistAnyFarmland()
for k, v in pairs(self.farmlandManager.cachedFarmlands) do
local luaFarmland = v
if not GameObjectUtil.Instance:ObjectIsNULL(luaFarmland.csfarmland) then
return true
end
end
return false
end
function FunctionInteractionGrass:Listen()
EventManager.Me():AddEventListener(LoadSceneEvent.FinishLoadScene, self.OnSceneBeLoaded, self)
EventManager.Me():AddEventListener(ServiceEvent.PlayerMapChange, self.OnMapChange, self)
end
function FunctionInteractionGrass:CancelListen()
EventManager.Me():RemoveEventListener(LoadSceneEvent.FinishLoadScene,self.OnSceneBeLoaded,self)
EventManager.Me():RemoveEventListener(ServiceEvent.PlayerMapChange, self.OnMapChange, self)
end
function FunctionInteractionGrass:OnSceneBeLoaded(message)
------------------- lawn -------------------
-- self:GetLawnsGameObject()
------------------- lawn -------------------
end
function FunctionInteractionGrass:OnMapChange(message)
self:Release()
self:Reset()
self.farmlandManager:Release()
self.farmlandManager:Reset()
-- EffectAndAudioForInteractionGrass_NoAppropriate.Instance():Reset()
LuaRolesOnCurrentMap.Ins():Reset()
-- LuaDynamicGrass.ReleasePoolEffectiveBody()
end
------------------- lawn -------------------
local effectiveDistanceOfLawn = {
Clover = 0.5,
}
function FunctionInteractionGrass:GetLawnsGameObject()
if self.gameObjectLawns == nil then
self.gameObjectLawns = {}
end
TableUtility.ArrayClear(self.gameObjectLawns)
local index = 1
while true do
local goLawn = GameObject.Find("Lawn" .. index)
if goLawn ~= nil then
table.insert(self.gameObjectLawns, goLawn)
index = index + 1
else
break
end
end
end
function FunctionInteractionGrass:IsExistAnyLawn()
if self.gameObjectLawns ~= nil then
for k, v in pairs(self.gameObjectLawns) do
local gameObjectLawn = v
if GameObjectUtil.Instance:ObjectIsNULL(gameObjectLawn) then
self.gameObjectLawns[k] = nil
end
end
if #self.gameObjectLawns > 0 then
return true
end
end
return false
end
------------------- lawn -------------------
function FunctionInteractionGrass:Release()
for _, v in pairs(self.cachedPlayersOnFarmlands) do
local playerOnFarmland = v
FunctionInteractionGrass.BackLuaVector3(playerOnFarmland.vec3Index)
ReusableTable.DestroyAndClearTable(playerOnFarmland)
end
self.cachedPlayersOnFarmlands = nil
end
function FunctionInteractionGrass:Reset()
self.cachedPlayersOnFarmlands = {}
end