Как сделать покупку предмета только за дайр или редиант?

  • Автор темы Автор темы Gaben
  • Дата начала Дата начала

Gaben

Пользователь
7 Авг 2016
15
0
Нужно, чтобы какие-то предметы можно было купить только за дайр, а какие-то только за редиант. Как так сделать? И как сделать предмет доступным только для 1 героя или запретить предмет для определённого героя?
 
Нужно, чтобы какие-то предметы можно было купить только за дайр, а какие-то только за редиант. Как так сделать? И как сделать предмет доступным только для 1 героя или запретить предмет для определённого героя?
1. Почти никак.
2. Почти никак.
Единственный вариант это использовать событие при при покупке предмета.
Мы можем посмотреть какая команда команда купила предмет, и если предмет им не доступен мы можем попросту удалить его из инвентаря. И так же для отдельных героев.
Или написать свой магазин с блекджеком.
 
Последнее редактирование модератором:
Gaben, в баребонесе есть замечательная библиотека Containers, так вот, качаешь баребонес, заходишь в нем на карту playground и смотришь: там стоят аппарат(шоп хороших парней) и енигма(плохих), потом заходишь в екземплы и там открываешь одноименный с картой файл, в котором как раз прописано создание этих магазинов. Скорее всего там можно, если все хорошо изучить, создать магазин и для определенного героя.
 
1. Почти никак.
2. Почти никак.

Про первое не знаю, а вот второе я делал.
У меня тут три персонажа, класса (эльф, dark knight, dark wizard) и все оружие и броня доступна только по классам. То есть бонусы от вещи может получать только определенный класс. Для остальных вещь пустышка.

Но у меня в моде всего три героя и если будет больше, то для каждого надо тоже проверку добавлять. Весьма муторный способ, но когда героев мало вполне нормальный.
 
Последнее редактирование модератором:
[quote author=Илья link=topic=1031.msg5725#msg5725 date=1470570936]
Про первое не знаю, а вот второе я делал.
У меня тут три персонажа, класса (эльф, dark knight, dark wizard) и все оружие и броня доступна только по классам. То есть бонусы от вещи может получать только определенный класс. Для остальных вещь пустышка.

Но у меня в моде всего три героя и если будет больше, то для каждого надо тоже проверку добавлять. Весьма муторный способ, но когда героев мало вполне нормальный.
[/quote]
А через "not" пробовал?
nnvhdApp870.jpg
 
Последнее редактирование модератором:
Последнее редактирование модератором:
Ну можешь делать тоже самое и через оператор "if not", только в моем случае разницы то нет :D

Там в зависимости от конкретного класса нужно удалять конкретные модификаторы. Как бы, тебе в любом случае нужно по троим пройтись.
 
Последнее редактирование модератором:
[quote author=Илья link=topic=1031.msg5725#msg5725 date=1470570936]
Про первое не знаю, а вот второе я делал.
У меня тут три персонажа, класса (эльф, dark knight, dark wizard) и все оружие и броня доступна только по классам. То есть бонусы от вещи может получать только определенный класс. Для остальных вещь пустышка.

Но у меня в моде всего три героя и если будет больше, то для каждого надо тоже проверку добавлять. Весьма муторный способ, но когда героев мало вполне нормальный.
[/quote]
Смотри как можно это реализовать довольно просто,
Добавляешь в KV в айтемы строку "MyLovelyClass" "Knight" или другие.
Потом фигачишь в каком нибудь файле парсинг айтемов кастомных, и записываешь их так:
Код:
item_class_table = {
["Knight"] = {
	["item_name_1"] = 1,
	["item_name_2"] = 1,
	}
}
А после проверяешь:
Код:
if item_class_table[my_hero_class][item_name] then
 давать бонус
else
 не давать бонус
end
 
Последнее редактирование модератором:
CryDeS, если не сложно, можно немного расписать это?
 
[quote author=I_GRIN_I link=topic=1031.msg5853#msg5853 date=1470822165]
CryDeS, если не сложно, можно немного расписать это?
[/quote]
И так, добавляешь в kv какой нибудь ключ свой типо "MyClass" "Knight" (к предмету).
Потом при старте гейммода( в ините ) парсишь файл с предметами и записываешь в глобальную табличку например:
К остальным глобальным
Код:
_G.class_items = {}
Потом собственно парсим:
Код:
local kv_table= LoadKeyValues('scripts/npc/npc_items_custom.txt')

_G.class_items["Knight"] = _G.class_items["Knight"] or {}

for item_name, item_data in pairs(kv_table) do 
	if item_name and item_data and type(item_data ) == "table" then

		if item_data['MyClass'] == "Knight" then
			print("item name = ", item_name, " is for Knight class");
			_G.class_items["Knight"][item_name] = 1;
		end

	end
end

Потом ставим слушателя на покупку предмета:
Код:
ListenToGameEvent('dota_item_purchased',	Dynamic_Wrap(GameMode, 'OnPlayerBuyItem'), self)

И его обработчика:
Код:
function GameMode:OnPlayerBuyItem(event)
	local playerid = event.PlayerID 
	local item_name = event.itemname
	local itemcost = event.itemcost
	local player = PlayerResource:GetPlayer(playerid)
	local hero = player:GetAssignedHero()
	local item

	for i = 0, 11 do -- посмотрим нет ли в стеше
		local item_slot = hero:GetItemInSlot(i)
		if item_slot and item_slot :GetName() == item_name and (item_slot :GetPurchaseTime() <= 10 and item_slot :GetPurchaseTime() >= 9.5) then
			item = item_slot
		end
	end
	if not _G.class_items[GetMyHeroPersonalClass(hero)][item_name] then
		UTIL_Remove(item);
		print("wrong hero class");
	end
end
GetMyHeroPersonalClass должна быть написана тобой и вернуть класс твоего героя.
Надеюсь ты понял.
 
Последнее редактирование модератором:
[quote author=I_GRIN_I link=topic=1031.msg5861#msg5861 date=1470836753]
CryDeS, спасибо большое
[/quote]
И там могут быть косяки, проверь на всякий случай. Но каркас выглядеть должен как то так по моей задумке.
 
Реклама: