CustomGames.ru - Dota 2 пользовательские игры

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

0 Пользователей и 1 Гость просматривают эту тему.

Оффлайн Gaben

  • 15
  • Мощь: 0
Нужно, чтобы какие-то предметы можно было купить только за дайр, а какие-то только за редиант. Как так сделать? И как сделать предмет доступным только для 1 героя или запретить предмет для определённого героя?
« Последнее редактирование: 07-08-2016, 06:15:29 от Gaben »

Оффлайн CryDeS

  • Друзья CG
  • 1212
  • Мощь: 12
Нужно, чтобы какие-то предметы можно было купить только за дайр, а какие-то только за редиант. Как так сделать? И как сделать предмет доступным только для 1 героя или запретить предмет для определённого героя?
1. Почти никак.
2. Почти никак.
Единственный вариант это использовать событие при при покупке предмета.
Мы можем посмотреть какая команда команда купила предмет, и если предмет им не доступен мы можем попросту удалить его из инвентаря. И так же для отдельных героев.
Или написать свой магазин с блекджеком.

Оффлайн I_GRIN_I

  • Продвинутый
  • 608
  • Мощь: 11
  • Научиться бы скриптить...
Gaben, в баребонесе есть замечательная библиотека Containers, так вот, качаешь баребонес, заходишь в нем на карту playground и смотришь: там стоят аппарат(шоп хороших парней) и енигма(плохих), потом заходишь в екземплы и там открываешь одноименный с картой файл, в котором как раз прописано создание этих магазинов. Скорее всего там можно, если все хорошо изучить, создать магазин и для определенного героя.

Оффлайн Илья

  • Супермодератор
  • 2131
  • Мощь: 21
1. Почти никак.
2. Почти никак.

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

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

« Последнее редактирование: 07-08-2016, 11:57:59 от Илья »

Оффлайн EnDronist

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

Но у меня в моде всего три героя и если будет больше, то для каждого надо тоже проверку добавлять. Весьма муторный способ, но когда героев мало вполне нормальный.
А через "not" пробовал?
Ням
Мой аддон: steamcommunity.com/...ils/?id=671144274
[свернуть]

Оффлайн Илья

  • Супермодератор
  • 2131
  • Мощь: 21

Оффлайн EnDronist

  • 222
  • Мощь: 1
  • Перфекционист-максималист
Через что?
Если у тебя был скрипт "если 1-ый герой, то нельзя. если 3-ий герой, то нельзя", то почему бы не сделать наоборот?:
"если не 2-ой герой, то нельзя"
Ням
Мой аддон: steamcommunity.com/...ils/?id=671144274
[свернуть]

Оффлайн Илья

  • Супермодератор
  • 2131
  • Мощь: 21
Ну можешь делать тоже самое и через  оператор "if not", только в моем случае разницы то нет :D

Там в зависимости от конкретного класса нужно удалять конкретные модификаторы. Как бы, тебе в любом случае нужно по троим пройтись.

Оффлайн CryDeS

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

Но у меня в моде всего три героя и если будет больше, то для каждого надо тоже проверку добавлять. Весьма муторный способ, но когда героев мало вполне нормальный.
Смотри как можно это реализовать довольно просто,
Добавляешь в 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

Оффлайн Илья

  • Супермодератор
  • 2131
  • Мощь: 21
Интересно. Буду знать, спасибо.

Оффлайн I_GRIN_I

  • Продвинутый
  • 608
  • Мощь: 11
  • Научиться бы скриптить...
CryDeS, если не сложно, можно немного расписать это?

Оффлайн CryDeS

  • Друзья CG
  • 1212
  • Мощь: 12
CryDeS, если не сложно, можно немного расписать это?
И так, добавляешь в 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 должна быть написана тобой и вернуть класс твоего героя.
Надеюсь ты понял.

Оффлайн I_GRIN_I

  • Продвинутый
  • 608
  • Мощь: 11
  • Научиться бы скриптить...
CryDeS, спасибо большое

Оффлайн CryDeS

  • Друзья CG
  • 1212
  • Мощь: 12
CryDeS, спасибо большое
И там могут быть косяки, проверь на всякий случай. Но каркас выглядеть должен как то так по моей задумке.