Название:Full-Inventory Crafting System Авторы:bowser499 aka [DUOS] and SirNikolas Тип исполнения:JASS2 and cJass Тестовая карта:Присутствует Минимальный патч:Любой
Одна из нашумевших наработок, которую мало кто доводил до конца конкретно на JASS2. Из-за крайней сложности её создания решил выложить, так как это решит много вопросов, с этим связанных.
Возможности:
Сбор при полном инвентаре (рецепты максимум до 7 слотов);
Сбор с участием идентичных предметов;
Смена иконки предмета из магазина и предмета в инвентаре (покупаешь рецепт с иконкой сборного предмета - в инвентарь идет свиток);
Смена предмета на деактивированный предмет (любой, кто берет предмет, не принадлежащий ему, не получает свойств предмета);
Сложение "зарядов" предметов (банка с 3 зарядами + банка с 8 зарядами = банка с 11 зарядами).
База данных предметов и рецептов формируется по следующему принципу:
1. Создаются в РО три копии одного и того же предмета:
Normal (обычный предмет, находится у купившего)
Rune (используется мгновенно, находится в магазине и лежит на земле)
Disabled (находится у того, кто "украл" предмет)
Обратите внимание: Все предметы должны быть нестандартными! 2. Rune-копии добавляются в магазины. 3. В триггере инициализации регистрируются предметы путем вызова для каждого FICS_Register(rawNormal, rawRune, rawDisabled, goldCost, lumberCost). Каждому предмету дается порядковый номер, начиная с единицы. 4. Наконец, составляется список рецептов. Вызывается функция FICS_RegisterN(resultId, id0, id1, ..., idN), где N - количество ингредиентов, а resultId, id0, id1, ..., id6 - порядковые номера предметов.
Импорт наработки:
Версия JASS2: 1. Скопируйте основной код карты FICS v1.6.w3x в основной код своей карты. 2. Скопируйте триггер "FICS". 3. Скопируйте все переменные (для облегчения задачи можно скопировать, а затем удалить триггер "FICS variables", если включено автоматическое создание переменных).
Версия cJass: 1. Скопируйте триггер "FICS cJass" (и разблокируйте его).
private constant timer T = CreateTimer(); private item Dropped[ ]; private int DropNum[ ], Temp[21]; private int DropCount = 0; private int ItemMap[ITEM_MAP_SIZE]; private int Items[500][5], Recipes[256][8]; private int ItemCount = 0, RecipeCount = 0; private int FirstList[ ], LastList[ ]; private int Recipe[ ], Next[ ], ListCount = 0; private int CallbackArgument = 0; private trigger Callbacks[500][2]; private bool Flag = true;
public int GetIndexById(int id) { return ItemMap[id - 'I000']; }
public int GetNormalByIndex(int index) { return Items[index][0]; }
public int GetRuneByIndex(int index) { return Items[index][1]; }
public int GetDisabledByIndex(int index) { return Items[index][2]; }
public int GetGoldCostByIndex(int index) { return Items[index][3]; }
public int GetLumberCostByIndex(int index) { return Items[index][4]; }
public trigger GetPickupCallbackByIndex(int index) { return Callbacks[index][0]; }
public trigger GetDropCallbackByIndex(int index) { return Callbacks[index][1]; }
public int GetManipulatedItemIndex() { return CallbackArgument; }
public int Register(int id, int rune, int dis, int gcost, int lcost) { ItemCount++; static if DEBUG_MODE { if id - 'I000' > ITEM_MAP_SIZE || rune - 'I000' > ITEM_MAP_SIZE || dis - 'I000' > ITEM_MAP_SIZE || id - 'I000' < 0 || rune - 'I000' < 0 || dis - 'I000' < 0 { BJDebugMsg("|cffff0000CRITICAL ERROR in FICS: Too many items. Increase the ITEM_MAP_SIZE constant. This message also may be shown if you are trying to register a standard item. Use only custom items instead.|r"); return 0; } } ItemMap[id - 'I000'] = ItemCount; ItemMap[rune - 'I000'] = ItemCount; ItemMap[dis - 'I000'] = ItemCount; Items[ItemCount][0] = id; Items[ItemCount][1] = rune; Items[ItemCount][2] = dis; Items[ItemCount][3] = gcost; Items[ItemCount][4] = lcost; return ItemCount; }
Спасибо. Система очень помогла. Только одно: у меня работало для одного игрока: красного - Player(0). Другим выдавал дисаблед предметы(Даже если покупал сам). Не знаю, может кому поможет: в функциях
Code
function Item_GetOwningPlayer takes item i returns player return Player(LoadInteger(udg_FicsHash,GetHandleId(i),10)) endfunction
function Item_SetOwningPlayer takes item i, player p returns nothing call SaveInteger(udg_FicsHash,GetHandleId(i),10,GetPlayerId(p)) endfunction
Заменил сохранение и загрузку интегера Id игрока на хэндл игрока. Стало работать для всех игроков.
А смысл? Разве мы не можем сказать, какой ID будет у какого игрока? Протестируй еще раз: вполне возможно, что после этого изменения можно пользоваться чужими предметами.
Вклеил систему в карту: сначала подстроил под неё - тестил, получил то, что выше описал. Потом попробовал ничего не трогать, тоже самое вышло. Чёрт знает. Я пока в джасе нуб, раз десятый уже просматриваю код: вроде всё верно.
Да. Создал там другого игрока: тоже самое - выдаёт Disabled предметы.
Добавлено (31 Май 2012, 23:34:04) --------------------------------------------- Несколько переделал систему: вместо сохранения в хеш-таблице Id игрока сделал присваивание предмету игрока (SetItemPlayer). Сразу говорю, не знаю на сколько утечна эта функция, но система стала работать для всех игроков(Тестил в своей карте). Изменил наработку [DUOS]'a: так же добавил совместимую c FICS систему собирания предметов магическим кругом (как в доте). Я думаю, что это полезно будет тем, кто систему использовать будет. Протестите, сам я багов не нашёл.
Добавлено (02 Июнь 2012, 00:01:55) --------------------------------------------- Друзья, нашёл баг (который так же присутствовал в варсии 1.2) - При передаче предмета напрямую (Не кладя на землю, а перетаскиванием иконки предмета на героя/юнита) юниту, не принадлежащему игроку предмет сохранялся в форме Normal. Исправлено!
Добавил: 1)Магический круг выкидывает на свою позицию предметы при покупке 2)Магический круг собирает предметы из НЕгероев, находящихся в области сбора (Если планируете использовать курьеров и т.д.)
Добавлено (18 Января 2013, 21:50:46) --------------------------------------------- SirNikolas другая проблема теперь(( Работает для игрока красного только((( Скиньте плз для 12 игроков. Очень прошу.
Добавлено (21 Января 2013, 15:07:52) --------------------------------------------- SirNikolas Перезалейте пожалуйста версию 1.4. В 1.2 работает только на красного игрока(((
Не зли других и сам не злись. Мы - гости в этом мире. И если что не так - смирись, Будь поумнее - улыбнись, Ведь в мире всё закономерно. Зло, излучённое тобой, К тебе вернётся непременно.
Дело в том, что уже есть функция Register, принимающая 5 аргументов. К тому же, я стремился сделать так, чтобы интерфейс библиотеки был одинаковым для всех языков. И мне это удалось.
Прошу прощения, за то что поднимаю старую тему, но я создал второго героя за Красного игрока и дал ему перчатки скорости. Получилось так что у обоих героев появился предмет. Передал обратно и у первого уже 3 перчатки. Ну и еще у меня пару ошибок в триггерах (уже в моей карте). Все кроме "FICS". Отсутствует функция FICS_Register в Базе...