- 20 Дек 2016
- 892
- 170
Я сделал свой манабар, инфа о нем хранится для каждого юнита в поле. Часть этой информации должна отправляться на клиент, чтобы отображать манабар и его состояние. Я реализовал это так:
Есть таблица, в которой ключи - индексы юнитов, а значения - таблицы с необходимой информацией. Эта таблица отправляется на клиент 30 раз в секунду, и там уже происходит дальнейшая обработка. Вот необходимая часть кода:
Проблема в том, что UpdateManaClientC после непродолжительной игры вызывает вот такое говно в консоли:
(В прошлой моей подобной теме это происходило по той же причине, просто тогда я даже предположить не мог из-за чего это)
При чем эти сообщения продолжают прилетать даже на паузе (что не удивительно, ибо финкер паузой не останавливается)
Собственно, в чем проблема и как ее исправить?
Мб во вложенности, тогда можно отправлять эвент для каждого юнита по отдельности, просто читал где-то, что обильный обмен сообщениями между клиентом-сервером тоже ни к чему хорошему не приводит. Сам этого еще не проверил, ибо прежде чем кардинально менять систему, мне хотелось бы быть уверенным, что это изменение поможет. Да и вложенность тут неизбежна, ибо abilities должно быть таблицей полюбому.
Те кто шарит, помогите плиз, уже не первый месяц с этой херней страдаю.
Есть таблица, в которой ключи - индексы юнитов, а значения - таблицы с необходимой информацией. Эта таблица отправляется на клиент 30 раз в секунду, и там уже происходит дальнейшая обработка. Вот необходимая часть кода:
RegisterManaBarC Вызывается для каждого юнита при первом спавне.
Финкер для UpdateManaClientC устанавливается после пика.
Две таблицы с инфой для клиента я сделал потому, что как выяснилось, индекс юнита может внезапно поменяться в процессе игры. Поэтому в одной я в качестве ключей использую хендлы юнитов, и перебираю по ней; а в другой ключи это индексы юнитов, ее я отправляю на клиент.
Финкер для UpdateManaClientC устанавливается после пика.
Две таблицы с инфой для клиента я сделал потому, что как выяснилось, индекс юнита может внезапно поменяться в процессе игры. Поэтому в одной я в качестве ключей использую хендлы юнитов, и перебираю по ней; а в другой ключи это индексы юнитов, ее я отправляю на клиент.
Lua:
_G.ManaBarRegistredUnits = ManaBarRegistredUnits or {}
_G.ManaBarRegistredUnitsIndex = {}
function CDOTA_BaseNPC:RegisterManaBarC()
if self:GetMaxMana() <= 0 then return end
self.manabar = table.deep_copy( ManaBar )
local unitKV = HeroesKV[ self:GetUnitName() ] or UnitsKV[ self:GetUnitName() ]
if unitKV then
self.manabar.mana_base = unitKV.StatusMana or self.manabar.mana_base
self.manabar.regen_base = unitKV.StatusManaRegen or self.manabar.regen_base
end
self:AddNewModifier( self, nil, "custom_manabar", {} )
self:CheckAbilitiesManacost()
ManaBarRegistredUnits[ self ] = {}
end
function _G.UpdateManaClientC()
for unit in pairs( ManaBarRegistredUnits ) do
if unit == nil or unit:IsNull() then
ManaBarRegistredUnits[ unit ] = nil
else
local abilities = {}
local slot = 0
for i = 0, unit:GetAbilityCount()-1 do
ability = unit:GetAbilityByIndex(i)
if ability and not ability:IsHidden() and not ability:IsAttributeBonus() then
abilities[ slot ] = ability:GetManaCostC()
slot = slot + 1
end
end
local manainfo = {
maxmana = unit:GetMaxManaC(),
mana = unit:GetManaC(),
regen = unit:GetManaRegenC(),
abilities = abilities
}
ManaBarRegistredUnits[ unit ] = manainfo
ManaBarRegistredUnitsIndex[ unit:entindex() ] = manainfo
end
end
CustomGameEventManager:Send_ServerToAllClients( "UpdateManaBarInfo", ManaBarRegistredUnitsIndex )
return 1/30
end
(В прошлой моей подобной теме это происходило по той же причине, просто тогда я даже предположить не мог из-за чего это)
При чем эти сообщения продолжают прилетать даже на паузе (что не удивительно, ибо финкер паузой не останавливается)
Собственно, в чем проблема и как ее исправить?
Мб во вложенности, тогда можно отправлять эвент для каждого юнита по отдельности, просто читал где-то, что обильный обмен сообщениями между клиентом-сервером тоже ни к чему хорошему не приводит. Сам этого еще не проверил, ибо прежде чем кардинально менять систему, мне хотелось бы быть уверенным, что это изменение поможет. Да и вложенность тут неизбежна, ибо abilities должно быть таблицей полюбому.
Те кто шарит, помогите плиз, уже не первый месяц с этой херней страдаю.