Jump to content
Sign in to follow this  
aleksandr

Рандом лут

Recommended Posts

Уже много раз поднимали вопрос о получении лута в игре. Довольно часто при походах в данжи "нехорошие игроки", старались жать кнопки подбора лута, чтобы им досталось всё, а другим ничего. Можно ли реализовать подбор лута таким образом, чтобы он был рандом?

Share this post


Link to post
Share on other sites

@aleksandr все таки это элемент игры: кто первый взял того и предмет. Я в свое время поэтому и вырубал игроков, которые рядом со мной пилили сундуки.

Что значит подбор лута чтобы он был рендом? Я считаю, что когда несколько человек беспорядочно жмут клавиши подбора лута на клавиатуре, чтобы забрать предмет, и этот предмет потом достается кому-то одному, это и есть настоящий рендом :)


Share this post


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

@aleksandr все таки это элемент игры: кто первый взял того и предмет. Я в свое время поэтому и вырубал игроков, которые рядом со мной пилили сундуки.

Что значит подбор лута чтобы он был рендом? Я считаю, что когда несколько человек беспорядочно жмут клавиши подбора лута на клавиатуре, чтобы забрать предмет, и этот предмет потом достается кому-то одному, это и есть настоящий рендом :)

Даже если все выпавшие вещи поднимал один человек, предмет может достаться кому угодно из пати, некий бросок кубика, у кого больше, тому и достается вещь.

А сейчас действует такая система - у кого пинг меньше до сервера, тот все и получит :)

Edited by aleksandr

Share this post


Link to post
Share on other sites

В других играх есть и система без кубика. В настройках отряда: "свободный" - кто поднял, "случайный" - если лутин несколько, по очереди по одной дается членам отряда. В пиратии зачастую решает не пинг, а то что ты круз с авто-подбором, стоящий ближе к мобу, чем хилящий тебя клер. Врядли можно реализовать.

Share this post


Link to post
Share on other sites

Можно попробовать добавить в GameServer.exe функцию, которая будет вызываться когда игрок подбирает лут, и в ней распределять поднятые предметы по игрокам в отряде.


Share this post


Link to post
Share on other sites

Можно так же запилить предмет, который падает члену отряда, и при активации этого предмета будет генерироваться предмет кому-то из отряда(видел вроде на мд)


Делай добро и бросай его в воду

Share this post


Link to post
Share on other sites

@aleksandr

Я добавил в GameServer.exe функцию OnPickupItem(). Она вызывается когда игрок подобрал лут. Далее я написал код, который с вероятностью 1 / n, где n - количество игроков в отряде, распределяет лут между игроками:

ВНИМАНИЕ, подводные камни:

1) Если игрок выбросит предмет и заново его подберет, то этот предмет может достаться кому-то из отряда;

2) Следует из п. 1 - Два игрока. Один где-то в Аскароне, второй в Шайтане. Они могут дистанционно обмениваться предметами. Исправить довольно легко. Нужно проверять что все игроки из отряда находятся на одной и той же карте и расстояние между ними не слишком большое.  

-- Событие возникает когда игрок поднял предмет
--
-- @role     Дескриптор персонажа
-- @item_id  ID предмета
-- @item_num Количество предмета
-- @item_pos Номер ячейки
--
-- @return   void
function OnPickupItem(role, item_id, item_num, item_pos)
	
	-- Проверяем что игрок в отряде
	if ( IsInTeam(role) == 1 ) then
		
		-- Заполняем массив с игроками в отряде
		local n = 1
		local player = {}
		
		player[1] = role
		
		for i = 0, 4, 1 do
			
			local cha = GetTeamCha(role, i)
			if (ValidCha(cha) == 1) then
				
				
				n = n + 1
				player[n] = cha
				
				-- Напишем всем сообщение что игрок поднял предмет
				SystemNotice(cha, "Игрок [" .. GetChaDefaultName(role) .. "] подобрал [" .. GetItemName(item_id) .. "] x [" .. item_num .. "]!")
			
			else
				break
			end
			
		end
		
		-- Случайно распределяем лут между игроками
		local r = math.random(1, n)

		if (player[r] ~= role) then
		
			-- Забираем предмет у  игрока ...
			DelBagItem(role, item_id, item_num) 
			-- ... и выдаем предмет другому игроку
			GiveItem(player[r], 0, item_id, item_num, 4)

		end

		-- Напишем кому достался предмет
		for i = 1, n, 1 do
			SystemNotice(player[i], "Предмет достался игроку [" .. GetChaDefaultName(player[r]) .. "]!")	
		end

	end
	
end

 

 

[Pickup]GameServer.exe

  • Like 1

Share this post


Link to post
Share on other sites
8 часов назад, V3ct0r сказал:

@aleksandr

Я добавил в GameServer.exe функцию OnPickupItem(). Она вызывается когда игрок подобрал лут. Далее я написал код, который с вероятностью 1 / n, где n - количество игроков в отряде, распределяет лут между игроками:

ВНИМАНИЕ, подводные камни:

1) Если игрок выбросит предмет и заново его подберет, то этот предмет может достаться кому-то из отряда;

2) Следует из п. 1 - Два игрока. Один где-то в Аскароне, второй в Шайтане. Они могут дистанционно обмениваться предметами. Исправить довольно легко. Нужно проверять что все игроки из отряда находятся на одной и той же карте и расстояние между ними не слишком большое.  


-- Событие возникает когда игрок поднял предмет
--
-- @role     Дескриптор персонажа
-- @item_id  ID предмета
-- @item_num Количество предмета
-- @item_pos Номер ячейки
--
-- @return   void
function OnPickupItem(role, item_id, item_num, item_pos)
	
	-- Проверяем что игрок в отряде
	if ( IsInTeam(role) == 1 ) then
		
		-- Заполняем массив с игроками в отряде
		local n = 1
		local player = {}
		
		player[1] = role
		
		for i = 0, 4, 1 do
			
			local cha = GetTeamCha(role, i)
			if (ValidCha(cha) == 1) then
				
				
				n = n + 1
				player[n] = cha
				
				-- Напишем всем сообщение что игрок поднял предмет
				SystemNotice(cha, "Игрок [" .. GetChaDefaultName(role) .. "] подобрал [" .. GetItemName(item_id) .. "] x [" .. item_num .. "]!")
			
			else
				break
			end
			
		end
		
		-- Случайно распределяем лут между игроками
		local r = math.random(1, n)

		if (player[r] ~= role) then
		
			-- Забираем предмет у  игрока ...
			DelBagItem(role, item_id, item_num) 
			-- ... и выдаем предмет другому игроку
			GiveItem(player[r], 0, item_id, item_num, 4)

		end

		-- Напишем кому достался предмет
		for i = 1, n, 1 do
			SystemNotice(player[i], "Предмет достался игроку [" .. GetChaDefaultName(player[r]) .. "]!")	
		end

	end
	
end

 

 

[Pickup]GameServer.exe

Ого, это реально клёво!

Большое спасибо ;)

Share this post


Link to post
Share on other sites

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.

Guest
Reply to this topic...

×   Pasted as rich text.   Restore formatting

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.

Sign in to follow this  

×
×
  • Create New...