XGM Forum
Сайт - Статьи - Проекты - Ресурсы - Блоги

Форуме в режиме ТОЛЬКО ЧТЕНИЕ. Вы можете задать вопросы в Q/A на сайте, либо создать свой проект или ресурс.
Вернуться   XGM Forum > StarCraft (только чтение)> Галактическая академия
Ник
Пароль
Войти через VK в один клик
Сайт использует только имя.

 
yellyex

offline
Опыт: 4,267
Активность:
Natives.galaxy - Применение
Привет!
По совету одного здешних малоизвестных обитателей со скелетом из неизвестного сплава металла, я начал изучать (только что) нативки редактора старкрафта 2. Эти нативки являются азбукой для него. Так вот, почти сразу после просмотра нативок, у меня созрел вопрос. А как, собственно, и где применить эти нативки?
Чтобы попрактиковаться по-простому, я решил морпеху изменить его количество здоровья, как текущее, так и максимальное. Я собрался использовать const int c_unitPropLife и const int c_unitPropLifeMax. Собственно, это моя первая цель. Вопрос (Сейчас редактора под рукой нету. Будет минут через 60). С чего мне начать писать?
Смысл в том, что имея на карте морпеха, взять и написать код вручную с нуля, так чтобы изменить здоровье морпеха на 1000/1000.
Старый 12.01.2013, 12:35
H
hello world
offline
Опыт: 130,725
Активность:
Где то на сайте была утилита для удобного отображения нативок, довольно полезно.
Изучение нативок вещь очень полезная, для написания собственных библиотек. Мне это позволило написать молнии xgm.ru/p/sc2/lightning-galaxy
Но вот использовать её на постоянной основе не рекомендую. Код может перестать совместимым с игрой после очередного патча и придется муторно искать в чем там проблема и что изменилось.
Старый 12.01.2013, 14:21
yellyex

offline
Опыт: 4,267
Активность:
Hellcore, спасибо конечно, но что толку, что я изучу нативки, если не знаю, как и преминить. Поэтому и сделал для себя очень просто пример с повышением здоровья у юнита. Хотелось бы, чтобы кто-нибудь знающий, написал пример, а дальше я сам разберусь.
yellyex добавил:
Сейчас попробую создать на ГУИ тот пример, что я хочу, переведу его в ГАЛАКСИ и посмотрю, как там сделано. Надеюсь не будет ничего лишнего после ГУИ.
yellyex добавил:
Создав два триггера MaxHealth и CurrentHealth, я не смог их перевести в ГАЛАКСИ. Можно посмотреть все скрипты, нажав CTRL+F11. Вот:
//==================================================================================================​
// 
// Generated Map Script
// 
// Name:   ??????????
// 
//==================================================================================================​
include "TriggerLibs/NativeLib"

//--------------------------------------------------------------------------------------------------​
// Library Initialization
//--------------------------------------------------------------------------------------------------​
void InitLibs () {
    libNtve_InitLib();
}

//--------------------------------------------------------------------------------------------------​
// Trigger Variables
//--------------------------------------------------------------------------------------------------​
trigger gt_MaxHealth;
trigger gt_CurrentHealth;

//--------------------------------------------------------------------------------------------------​
// Trigger: MaxHealth
//--------------------------------------------------------------------------------------------------​
bool gt_MaxHealth_Func (bool testConds, bool runActions) {
    // Actions
    if (!runActions) {
        return true;
    }

    UnitSetPropertyFixed(UnitFromId(1), c_unitPropLifeMax, 1000.0);
    return true;
}

//--------------------------------------------------------------------------------------------------​
void gt_MaxHealth_Init () {
    gt_MaxHealth = TriggerCreate("gt_MaxHealth_Func");
    TriggerAddEventTimeElapsed(gt_MaxHealth, 3.0, c_timeGame);
}

//--------------------------------------------------------------------------------------------------​
// Trigger: CurrentHealth
//--------------------------------------------------------------------------------------------------​
bool gt_CurrentHealth_Func (bool testConds, bool runActions) {
    // Actions
    if (!runActions) {
        return true;
    }

    UnitSetPropertyFixed(UnitFromId(1), c_unitPropLife, 1000.0);
    return true;
}

//--------------------------------------------------------------------------------------------------​
void gt_CurrentHealth_Init () {
    gt_CurrentHealth = TriggerCreate("gt_CurrentHealth_Func");
    TriggerAddEventTimeElapsed(gt_CurrentHealth, 3.0, c_timeGame);
}

//--------------------------------------------------------------------------------------------------​
// Trigger Initialization
//--------------------------------------------------------------------------------------------------​
void InitTriggers () {
    gt_MaxHealth_Init();
    gt_CurrentHealth_Init();
}

//--------------------------------------------------------------------------------------------------​
// Map Initialization
//--------------------------------------------------------------------------------------------------​
void InitMap () {
    InitLibs();
    InitTriggers();
}
Не нашёл, как спрятать в оффтоп.
Я сделал триггер, который после трёх секунд, после того, как загрузилась карта, морпех, который уже стоит на карте (координаты 20, 20) получает максимальное и текущее количество здоровья равное 1000 единицам.
Всё это очень интересно, но нифига не понятно.
yellyex добавил:
Создал пользовательский триггер с именем CustomMaxHealth. Заменил недостающие Custom во всех местах:
bool gt_CustomMaxHealth_Func (bool testConds, bool runActions) {
    // Actions
    if (!runActions) {
        return true;
    }

    UnitSetPropertyFixed(UnitFromId(1), c_unitPropLifeMax, 1000.0);
    return true;
}
void gt_CustomMaxHealth_Init () {
    gt_CustomMaxHealth = TriggerCreate("gt_CustomMaxHealth_Func");
    TriggerAddEventTimeElapsed(gt_CustomMaxHealth, 3.0, c_timeGame);
}
Но выдаёт ошибку при компиляции:
Ошибка компиляции скрипта: Ошибка при разборе строки фнукции. Возможно, недопустимое имя переменной или функции или отсутствует } в конце объявления функции. (дополнительная информация — в "Редакторе триггеров").
gt_CustomMaxHealth = TriggerCreate("gt_CustomMaxHealth_Func");
Старый 12.01.2013, 16:05
H
hello world
offline
Опыт: 130,725
Активность:
Лол что за фигню ты сделал -_-
Я уже пол года не заходил в редактор, так что плохо помню все но примерно так:
((код jass
void HealUnit(int UnitId, fixed HealVal)
{
UnitSetPropertyFixed(UnitFromId(UnitId), c_unitPropLifeMax, HealVal);
}
))
Т.е в твоем случае если вставить этот код в кустом скрипт, пехотинец должен вылечится:
custom script: HealUnit(1,1000);
Hellcore добавил:
А вообще все это гораздо проще через GUI делать, лучше лезть в код тогда когда ты сам поймешь что уже шаришь. Но не пытаться заставить свой мозг насильно понять как там все работает =)
Старый 12.01.2013, 16:44
Зевс
Адская Зверюга
offline
Опыт: 152,154
Активность:
В гуи и без этого можно задавать максимальное количество здоровья.
Старый 12.01.2013, 17:29
yellyex

offline
Опыт: 4,267
Активность:
Зевс:
В гуи и без этого можно задавать максимальное количество здоровья.
Я смотрю тут понимают чего я хочу. Я хочу научиться писать на ГАЛАКСИ.
Старый 12.01.2013, 18:12
ScorpioT1000
Работаем
offline
Опыт: отключен
Ну попробуй написать что-то, что не сделать в простом старике. Например, полезно научиться работать со строками, попробуй сделать какую-нибудь там текстовую общалку я не знаю, включение режимов по вводу в чат. Или что-нибудь математическое
Тебе могут помочь мои функции из ScEncrypt:
//====================================================
// name: ScMath
// author: ScorpioT1000
// note: my libs uses it
//====================================================

int ceil(fixed f) {
    int x = FixedToInt(f);
    if(f > IntToFixed(x)) { return x+1; }
    return x;
}

// little endian, from 0
int int2byte0(int source) { return (source & 0xFF); }
int int2byte(int source, int index) { return ((source >> (index*8)) &  0xFF); }
int int2short0(int source) { return (source & 0x0000FFFF); }
int int2short1(int source) { return (source  << 8); }

//====================================================
// name: ScString
// author: ScorpioT1000
// note: '\n' and '\r' chars don't work
//====================================================
const string scASCIITable="\x1\x2\x3\x4\x5\x6\x7\x8\x9\x1\xB\x1\xD\xE\xF\x10\x11\x12\x13\x14\x15\x16\x17\x18​&#8203;\x19\x1A\x1B\x1C\x1D\x1E\x1F\x20!\x22#$%&'()*+,-./0123456789:;\x3C=\x3E?@ABCDEFGHIJKL​MNOPQRSTUVW&#8203;XYZ[\x5C]^_`abcdefghijklmnopqrstuvwxyz{|}~\x7F"; 

// conversion
int string2char(string s) {
    return (StringFind(scASCIITable,s,true));
}
string char2string(int ch) {
    if(ch==0) { return "\x0"; }
    return StringSub(scASCIITable,ch,ch);
}

// add one char to the tail
string stringAddChar(string s, int ch) {
    return s+char2string(ch);
}

// get/set one char in specific position (from 0)
int stringGetChar(string s, int position) {
    return string2char(StringSub(s,position+1,position+1));
}
int stringGetCharPos(string s, string ch) {
    return (StringFind(s,ch,true)-1);
}
string stringSetChar(string s, int position, int ch) {
    int len = StringLength(s);
    position = position + 1; //from 0
    if(len <= 1) { return char2string(ch); }
    if(position == 1) {
        return char2string(ch)+StringSub(s,2,len);
    } else if(position >= (len-1)) {
        return StringSub(s,1,(len-2))+char2string(ch);
    }
    return StringSub(s,1,position-1)+char2string(ch)+StringSub(s,position+1,(len-1));
}

string substr(string src, int start, int end) { return StringSub(src,start+1,end+1); }
string strchar(string src, int index) { return StringSub(src,index+1,index+1); }
Старый 12.01.2013, 19:13
Зевс
Адская Зверюга
offline
Опыт: 152,154
Активность:
yellyex:
Зевс:
В гуи и без этого можно задавать максимальное количество здоровья.
Я смотрю тут понимают чего я хочу. Я хочу научиться писать на ГАЛАКСИ.
На сколько я знаю с этим сейчас проблемы. Через анус в galaxy++ не написать.
Старый 13.01.2013, 00:05

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск

Ваши права в разделе
Вы не можете создавать темы
Вы не можете отвечать на сообщения
Вы не можете прикреплять файлы
Вы можете скачивать файлы

BB-коды Вкл.
[IMG] код Вкл.
HTML код Выкл.
Быстрый переход



Часовой пояс GMT +3, время: 21:58.