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

258 lines
7.2 KiB
Plaintext

autoImport('ArrayUtil')
autoImport('LuaDynamicGrass')
autoImport('AudioPlayerOfInteractionGrass')
LuaFarmland = class('LuaFarmland')
local gReusableArray1 = {}
local gReusableArray2 = {}
local gReusableArray3 = {}
local gReusableArray4 = {}
local gReusableLuaVector3 = LuaVector3.zero
LuaFarmland.PlantType = {
Wheat = 0,
Convallaria = 1,
Clover = 2
}
local ArrayClear = TableUtility.ArrayClear
local ArrayShallowCopy = TableUtility.ArrayShallowCopy
function LuaFarmland:ctor()
self.rect = LuaRect.new(0,0,0,0)
end
function LuaFarmland:IsOverlapOther(otherLand)
return self.rect:Overlaps(otherLand.rect)
end
function LuaFarmland:AttachGameObject(go)
self.gameObject = go
end
function LuaFarmland:Transform()
return self.gameObject.transform
end
function LuaFarmland:Initialize()
self.dynamicGrasses = {}
local transPlants = self:Transform():Find('Plants')
local plantsCount = transPlants.childCount
for i = 0, plantsCount - 1 do
local transPlant = transPlants:GetChild(i)
local goPlant = transPlant.gameObject
local dg = LuaDynamicGrass.new()
self.dynamicGrasses[tonumber(goPlant.name)] = dg
dg:AttachGameObject(goPlant)
dg:Initialize()
dg:Launch(self.csfarmland.plantType, self.csfarmland.effectiveDistance)
end
self.lastEffectiveUnitsOfRoles = {}
self.unitPosOfRoles = {}
end
function LuaFarmland:SetCSFarmland(csfarmland)
self.csfarmland = csfarmland
self.csfarmlandAnchorPoint = self.csfarmland.AnchorPoint
if(self.csfarmland) then
self.id = self.csfarmland.id
self.idBitValue = 2 ^ (self.id-1)
self.widthBaseUnit = self.csfarmland.widthBaseUnit
self.heightBaseUnit = self.csfarmland.heightBaseUnit
self.rect:SetPos_XY(self.csfarmlandAnchorPoint[1],self.csfarmlandAnchorPoint[3])
self.rect:SetSize_WH(self.csfarmland.Width,self.csfarmland.Height)
end
end
function LuaFarmland:GetIDBitValue()
return self.idBitValue
end
function LuaFarmland:IsPointInside(point)
return self.rect:Contains_3(point)
end
function LuaFarmland:GetPosBaseUnit(unit_index)
if unit_index > 0 and unit_index <= self.csfarmland.unitIndexMax then
if self.csfarmland.widthBaseUnit > 0 then
local line = 0
local column = 0
local divisor = math.CaculateQuotient(unit_index, self.csfarmland.widthBaseUnit)
local remainder = math.CaculateRemainder(unit_index, self.csfarmland.widthBaseUnit)
if remainder > 0 then
column = remainder
line = divisor + 1
else
column = self.csfarmland.widthBaseUnit
line = divisor
end
return {[1] = line, [2] = column}
end
end
return nil
end
function LuaFarmland:_UnitPosToPosID(column,line)
return column*1000 + line
end
function LuaFarmland:_PosIDToUnitPos(posID)
return math.floor(posID/1000),posID % 1000
end
local validUnitsIndex = {}
function LuaFarmland:_GetEffectiveUnitsFromLocalPos(localPos)
local x,z = localPos[1],localPos[3]
local column,line = math.ceil(self.widthBaseUnit * x/ self.csfarmland.Width),math.ceil(self.heightBaseUnit * z / self.csfarmland.Height)
validUnitsIndex = self:_GetEffectUnitsFromColunmLine(column,line)
return validUnitsIndex,self:_UnitPosToPosID(column,line)
end
function LuaFarmland:_GetEffectUnitsFromColunmLine(column,line)
ArrayClear(validUnitsIndex)
local unitIndex
for i = column-1,column+1 do
if(i>0 and i<=self.widthBaseUnit) then
for j = line-1,line+1 do
if(j>0 and j<=self.heightBaseUnit) then
unitIndex = self:GetUnitIndexFromPosBaseUnit(j, i)
if(self.dynamicGrasses[unitIndex]) then
validUnitsIndex[#validUnitsIndex+1] = unitIndex
end
end
end
end
end
return validUnitsIndex
end
function LuaFarmland:GetEffectiveUnitsFromPos(pos)
gReusableLuaVector3:Set(pos[1] - self.csfarmlandAnchorPoint[1], pos[2] - self.csfarmlandAnchorPoint[2], pos[3] - self.csfarmlandAnchorPoint[3])
return self:_GetEffectiveUnitsFromLocalPos(gReusableLuaVector3)
end
function LuaFarmland:GetUnitIndexFromPosBaseUnit(line, column)
return (line - 1) * self.csfarmland.widthBaseUnit + column
end
function LuaFarmland:SomebodyOccur(role_id,pos)
local tempUnitsIndex,unitPosID = self:GetEffectiveUnitsFromPos(pos)
if tempUnitsIndex ~= nil and #tempUnitsIndex > 0 then
for i = 1, #tempUnitsIndex do
local dg = self:GetDynamicGrassFromUnitIndex(tempUnitsIndex[i])
dg:MoveOrAdd(role_id)
end
self:TryPlayAudio()
end
local lastUnitPosID = self.unitPosOfRoles[role_id]
if(lastUnitPosID~=unitPosID) then
if(lastUnitPosID) then
--todo
end
self.unitPosOfRoles[role_id] = unitPosID
end
end
function LuaFarmland:_HandleMoveOrAdd(role_id,unitsIndex)
if unitsIndex ~= nil and #unitsIndex > 0 then
for i = 1, #unitsIndex do
local dg = self:GetDynamicGrassFromUnitIndex(unitsIndex[i])
dg:MoveOrAdd(role_id)
end
self:TryPlayAudio()
end
end
local cachedIndexs2 = {}
function LuaFarmland:SomebodyMove(role_id,pos)
local tempUnitsIndex,unitPosID = self:GetEffectiveUnitsFromPos(pos)
local lastUnitPosID = self.unitPosOfRoles[role_id]
if(lastUnitPosID~=unitPosID) then
self.unitPosOfRoles[role_id] = unitPosID
ArrayClear(cachedIndexs2)
ArrayShallowCopy(cachedIndexs2,tempUnitsIndex)
if(lastUnitPosID) then
local lastColumn,lastLine = self:_PosIDToUnitPos(lastUnitPosID)
local lastUnits = self:_GetEffectUnitsFromColunmLine(lastColumn,lastLine)
if lastUnits ~= nil and #lastUnits > 0 then
for i = 1, #lastUnits do
local dg = self:GetDynamicGrassFromUnitIndex(lastUnits[i])
dg:DirtyRemove(role_id)
end
end
tempUnitsIndex = cachedIndexs2
end
end
self:_HandleMoveOrAdd(role_id,tempUnitsIndex)
end
function LuaFarmland:SomebodyIdle(role_id)
end
function LuaFarmland:SomebodyLeave(role_id)
local lastUnitPosID = self.unitPosOfRoles[role_id]
if(lastUnitPosID) then
local lastColumn,lastLine = self:_PosIDToUnitPos(lastUnitPosID)
local lastUnits = self:_GetEffectUnitsFromColunmLine(lastColumn,lastLine)
if lastUnits ~= nil and #lastUnits > 0 then
for i = 1, #lastUnits do
local dg = self:GetDynamicGrassFromUnitIndex(lastUnits[i])
dg:RemoveEffectiveBody(role_id)
end
end
end
self.unitPosOfRoles[role_id] = nil
end
function LuaFarmland:GetDynamicGrassFromUnitIndex(unit_index)
return self.dynamicGrasses[unit_index]
end
function LuaFarmland:Release()
-- release dynamicGrasses
for _, v in pairs(self.dynamicGrasses) do
local dg = v
dg:Release()
end
self.dynamicGrasses = nil
-- release lastEffectiveUnitsOfRoles
self.lastEffectiveUnitsOfRoles = nil
self.unitPosOfRoles = nil
end
function LuaFarmland:Update()
for _, v in pairs(self.dynamicGrasses) do
local dg = v
dg:Update()
end
end
function LuaFarmland:GetAudioSource()
if self.audioSource == nil then
local audioSource = self:Transform():GetComponentInChildren(AudioSource)
if audioSource == nil then
audioSource = self.gameObject:AddComponent(AudioSource)
end
self.audioSource = audioSource
end
return self.audioSource
end
function LuaFarmland:TryPlayAudio()
local audioSource = self:GetAudioSource()
if not audioSource.isPlaying then
if self.csfarmland.plantType == LuaFarmland.PlantType.Wheat then
self:PlayAudio(AudioMap.Maps.WheatBeShoved, audioSource)
end
end
end
function LuaFarmland:PlayAudio(audio_path, audio_source)
self:DoPlayAudio(audio_path, audio_source)
end
function LuaFarmland:DoPlayAudio(audio_path, audio_source)
AudioPlayerOfInteractionGrass.PlayOneShot(audio_path, audio_source)
end