Jump to content
Sign in to follow this  
BETEP/macs509

Баг мануфака (фикс)

Recommended Posts

Наверное все слышали о таком баге, что игроки выкидывают морской мануфак с суши и подбирают его в трюм корабля. Он становится бесконечным, пока вы не сойдете на сушу.

Вот сам фикс:

Ищем все _Begin и _End функции мануфака. Из _Begin удаляем:Код (C (Unknown Language)):

local item_count = CheckBagItem(atk_role, _ид_предмета_данного_мануфака_)

if item_count <= 0 then

    SkillUnable(atk_role)

    SystemNotice(atk_role, "Does not possess required item to use skill")

end

local a = DelBagItem(atk_role, _ид_предмета_данного_мануфака_, 1)

Дописываем в каждую _End функцию после проверки на KitbagLock:

local atk_role = TurnToCha(ATKER)

local item_count = CheckBagItem(atk_role, _ид_предмета_данного_мануфака_)

if item_count <= 0 then

    SkillUnable(atk_role)

    SystemNotice(atk_role, "Does not possess required item to use skill")

    return 0

end

DelBagItem(atk_role, _ид_предмета_данного_мануфака_, 1)

Вот и весь фикс.
 

©Insider

Share this post


Link to post
Share on other sites

Чтобы не редактировать каждую функцию, так как их может быть много, можно перехватывать каждую begin- и end-функцию и подставлять наш исправленный код.

 

В папке GameServer\resource\script\calculate создаем скрипт manufacture_fix.lua со следующим содержимым:

print("Loading file manufacture_fix.lua")

-- Таблица функций мануфактуры
--  которые необходимо исправить
local manufacture_fix_table = {
	
	--[[
		[ID предмета] = {
			func_beg = "begin-функция",
			func_end = "end-функция"
		},
	]]--
	
	[1136] = {
		func_beg = "Skill_ShanGD1_Begin",
		func_end = "Skill_ShanGD1_End"
	},
	
	[1137] = {
		func_beg = "Skill_FuShe1_Begin",
		func_end = "Skill_FuShe1_End",
	}

}

-- Begin - функция
function manufacture_fix_begin_func(role, sklv)

	local NocLock =	KitbagLock(role, 0)
	if NocLock == LUA_FALSE then
		SystemNotice( role , "Inventory has been binded")
		return 0
	end
	
end

-- End - функция
function manufacture_fix_end_func(ATKER, DEFER, sklv, item_id) 

	-- Наш код
	local atk_role = TurnToCha(ATKER)
	local item_count = CheckBagItem(atk_role, item_id)
	if item_count <= 0 then
		SkillUnable(atk_role)
		SystemNotice(atk_role, "Does not possess required item to use skill")
		return 0
	end

	DelBagItem(atk_role, item_id, 1)
	
	
	-- Вызываем оригинальную функцию
	_G[manufacture_fix_table[item_id].func_end .. "_original"](ATKER, DEFER, sklv)
	
end

-- Связать end - функцию с ID предмета
function bind_func(item_id)
   return function(ATKER, DEFER, sklv) return manufacture_fix_end_func(ATKER, DEFER, sklv, item_id) end
end


-- Перехватываем функции мануфактуры
for item_id, data in pairs(manufacture_fix_table) do
	
	_G[data.func_beg] = manufacture_fix_begin_func
	_G[data.func_end .. "_original"] = _G[data.func_end]
	_G[data.func_end] = bind_func(item_id)
	
end

 

Заполняем таблицу manufacture_fix_table и подключаем скрипт manufacture_fix.lua в конце файла skilleffect.lua

dofile(GetResPath("script\\calculate\\manufacture_fix.lua"))

 

В результате скрипт автоматически исправит баг с мануфаком и вам не придется вручную редактировать каждую функцию.

 

P.S. Не тестировал, но должно работать

Share this post


Link to post
Share on other sites
2 часа назад, Stinger сказал:

Предлагаю более радикальный вариант. 

 


function SkillUnable(player)

local pkt = GetPacket()
  
WriteCmd(pkt, 1505)
SendPacket(player,pkt)

end

 

Просто добавляем эту функцию  и не нужно ничего исправлять, накосячил - распишись.


Можно таким же методом реализовать защиту от анти-анимации?
Запускать КД на 1 сек всех навыков после использования одного?

Share this post


Link to post
Share on other sites
10 минут назад, Fomin сказал:


Можно таким же методом реализовать защиту от анти-анимации?
Запускать КД на 1 сек всех навыков после использования одного?

бестолку, думаю можно не объяснять почему. Проще увеличь КД у скилов четко по длине анимации

Share this post


Link to post
Share on other sites
Только что, Knight сказал:

бестолку, думаю можно не объяснять почему. Проще увеличь КД у скилов четко по длине анимации 

Нет, маленько не понял.

Смотри, ставя анти-анимацию, игрок может прожать за 1 секунду несколько скиллов.
А без анти-анимации, клиент этого не позволит, нужно будет дождаться окончания анимации на персонаже.

Share this post


Link to post
Share on other sites
function SkillUnable ( player )
local pkt = GetPacket ()
  
WriteCmd ( pkt , 1505 ) 
SendPacket ( player , pkt )
end


Where to put this function? @Stinger

Edited by FapFap

Share this post


Link to post
Share on other sites

К слову, в 2.0 защита вшита. ВСЕ скиллы отправляются на КД после прожатия любого навыка.

Share this post


Link to post
Share on other sites
38 минут назад, Stinger сказал:

Это будет не эффективно , допустим если мне нужно использовать только тело феи моментально , я использую и все , мне достаточно , секунда вовсе не проблема. Так же в 2.0, иногда достаточно 1 го Скилла без анимации, нужно копать глубже . 

 

А вообще можно , создавать переменную и записывать время + 1 секунду , но суть в том , что скилл уйдёт в откат , да он конечно не сработает , в своё время я так решил проблему когда сделали оглушение от метеоритного дождя и зажигательных пуль , игроки быстро меняли оружие и стан выходил бесконечный, это решило проблему, правда я просто отключал стан у второго навыка а не отключал игрока )) Можно реализовать таким образом , при отключении , вешать скилл который блокирует навыки на пару секунд , предварительно убрав анимацию ))

Можно ли как то прописать эффект сразу ко всем навыкам, не прописывая к каждому?)

"Нажал любой скилл - эффект на анти-навыки наложился."

Share this post


Link to post
Share on other sites
В 05.09.2018 в 05:52, Stinger сказал:

Как я понял, тут не принято помогать друг другу просто так, кто успел скачать - наздоровье.

Можно поинтересоваться, почему вы так решили?

Share this post


Link to post
Share on other sites
On 9/4/2018 at 10:52 PM, Stinger said:

Как я понял, тут не принято помогать друг другу просто так

Ничего подобного. В данном случае, помогать просто так не хочешь именно ты, и при этом проецируешь свое странное поведение на весь форум. Напиши пару статей, выложи разработанные тобой программы или скрипты, внеси вклад в наш форум, и все будут тебе рады. Понятное дело, это гораздо сложнее, чем писать глупые комментарии. 

Share this post


Link to post
Share on other sites

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now
Sign in to follow this  

×