УРА! Рабочий код - поправлены переменные (из-за них могли быть ошибки).
/*
Spell Damage Message System -=- Система отображения всплывающего урона Are you realy think something will be here?
ver. 2.0 (build 200)
Создатель: FREEZE_ball
fxd by Head_Hunter_44
fxd by Nekit1234007
Для сайта xgm.ru
01.03.2011
*/
/*
OOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOO
OOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOO
OO OO
OO ###### ############ ## ###### #### #### ############ OO
OO ## ## ############ #### ## ## ## ## ## ## ############ OO
OO ## ## ## ## ## ## ## ## ## ## ## ## OO
OO ######## ## ## ## ## ## ## #### ## ## OO
OO ##### ######### ######## ## ## ## #### ## ######### OO
OO ## ## ######### ########## ## ## ## ## ######### OO
OO ## ## ## ## ## ## ## ## ## ## OO
OO ## ## ## ## ## ## ## ## ## ## OO
OO ## ## ########### ## ## ## ## ## ## ############ OO
OO ### #### ########### #### #### ###### #### #### ############ OO
OO OO
OOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOO
OOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOO о_О
Эта система для отображения наносимого юниту урона в виде всплывающего над ним текста
сделана пользователем русского модмейкинг-портала XGM.RU, FREEZE_ball'ом 13ого - 14ого
мая 2010 года. Версия 2.0 является прямым потомком более ранних версий системы, сделанных
мной в 2009ом году, однако представляет собой написанную полностью с нуля систему,
в корне отличающуюся от ранних билдов. В версии 2.0 более гибкие настройки, а также
возрождены старые возможности, доступные в версии 0.3, которые я удалил.
Импорт системы не представляет собой никаких сложностей, достаточно лишь перенести
этот триггер в вашу карту. Также вы можете просто скопировать этот код.
Настройка также проста, все параметры подробно описаны, а для совсем ленивых
дефолтные настройки соответствуют самым "популярным" =)
Не глядите на растянутость кода, при сохранении карты он будет сжат в соответствии с вашими настройками.
Единственное ограничение системы - необходимость использования cJass
парсера (отсюда следует использование JNGP). Желательны, разумеется,
последние версии.
Самую хорошую сборку, включающую в себя и JNGP, и cJass, и ещё пару полезных фиговин,
вы можете скачать по адресу: http://xgm.ru/p/wc3/4585 Ваш монитор - отстой
Самую последнюю версию cJass'а ищите где-то тут: cjass.xgm.ru
Самые последние версии SDMS ищите в этом топике: http://xgm.ru/forum/showthread.php?t=13743
О найденных багах сообщать там же, регистрация на xgm.ru бесплатна и проста.
Удачи вам в этом сверхсложном деле, модмейкинге! =)
С уважениям к пользователям своей системы и к человечеству в целом,
FREEZE_ball
2010
*/
library_once SDMS initializer Init {
define {
void = nothing //Эту и последущие три строки вы должны удалить, если используете в вашей карте
int = integer //импортируемую библиотеку cJass'а "cj_types.j".
bool = boolean //Подробно об этой библиотеке читайте
float = real //в мануале к cJass'у.
/*==================================================
=====================Настройки======================
===================================================*/
private IsDebug = true //Если этот параметр равен true, будет отображаться отладочная информация.
private ColorS = "|c" //Изменение этого параметра не рекомендуется, иначе цвета
//не будут отображаться корректно.
private Color0 = "00"+"ff"+"03"+"03" //макросы ColorXX задают цвета, которыми для определенных игроков будут
private Color1 = "00"+"00"+"42"+"ff" //отображаться тексты всплывающего урона.
private Color2 = "00"+"1c"+"e6"+"b9" //Первый параметр - A (прозрачность, Alpha-channel, Transparency).
private Color3 = "00"+"54"+"00"+"79" //Второй параметр - R (красный, Red).
private Color4 = "00"+"ff"+"fc"+"01" //Третий параметр - G (зелёный, Green).
private Color5 = "00"+"fe"+"8a"+"0e" //Четвёртый параметр - B (синий, Blue).
private Color6 = "00"+"20"+"c0"+"00" //Вы сожете изменить эти параметры, если знаете,
private Color7 = "00"+"e5"+"5b"+"b0" //что они значат. Подробнее читайте в википедии
private Color8 = "00"+"95"+"96"+"97" //про ARGB систему.
private Color9 = "00"+"7e"+"bf"+"f1" //Цифра после Color обозначает номер игрока
private Color10 = "00"+"10"+"62"+"46" //согласно jass классификации: игрок 1 (красный) имеет номер 0.
private Color11 = "00"+"4e"+"2a"+"04"
private Color12 = "00"+"28"+"28"+"28" //Игроки с номерами 12-14 - нейтральные, поэтому в стандартном отображении имеют
private Color13 = "00"+"28"+"28"+"28" //один цвет - серый.
private Color14 = "00"+"28"+"28"+"28"
/*
Следущие 10 параметров отвечают за создание всплывающего урона с цветом
отношения атакованного игрока к атакуемому и к игроку,
для которого создаётся всплывающий текст.
Это необходимо при типе отображения урона 3 (см. далее)
*/
private scYY = "00"+"00"+"00"+"ff" //Ваши войска атакованы вашими войсками
private scYA = "00"+"ff"+"80"+"80" //Ваши войска атакованы войсками вашего союзника.
private scYE = "00"+"80"+"00"+"00" //Ваши войска атакованы войсками врага.
private scAY = "00"+"80"+"00"+"80" //Войска вашего союзника атакованы вашими войсками.
private scAA = "00"+"80"+"80"+"ff" //Войска вашего союзника атакованы войсками вашего союзника.
private scAE = "00"+"ff"+"ff"+"00" //Войска вашего союзника атакованы войсками вашего врага.
private scEY = "00"+"00"+"ff"+"00" //Войска вашего врага атакованы вашими войсками.
private scEA = "00"+"00"+"80"+"80" //Войска вашего врага атакованы войсками вашего союзника.
private scEE = "00"+"00"+"80"+"00" //Войска вашего врага атакованы войсками вашего врага.
private scOO = "00"+"ff"+"ff"+"ff" //Критерии атаки не отвечают не одному из вышеперечисленных.
private Font_Size = 12. //Этот параметр отвечает за размер всплывающего текста.
private Life_Time = 1.5 //Этот параметр отвечает за время жизни всплывающего текста.
private Prev_Text = "-" //Этот параметр отвечает за текст, который будет отображаться перед числом всплывающего урона:
//стандартно: "-100500".
private Next_Text = "" //Аналогично ПОСЛЕ числа.
private Not_Display_On_Fog_Of_War = true //Если этот параметр равен true, всплывающий урон будет отображаться
//ТОЛЬКО для тех игроков, которым туман войны не застилает точку отображения этого урона, О_о и что вы тут забыли?
//Если равно false, текст будет появляться даже в закрытых областях. тут системы нет
//Выставьте true, если у вас на карте есть закрытые туманом войны области. передвиньте курсор вправо
//В противоположном случае лучше выставить false, т.к. менее ресурсотребовательно. до упора! >_<
private Display_Type = 2 //Тип отображения урона.
//Задаётся числом 1, 2 или 3.
//Если тип отображения - 1, то цвет всплывающего урона будет цветом игрока, КОТОРОМУ нанесли урон.
//Если тип отображения - 2, то цвет всплывающего урона будет цветом игрока, КОТОРЫЙ нанёс урон.
//Если тип отображения - 3, то цвет всплывающего урона будет соответствовать отношениям между игроком,
//который видит всплывающий текст, и игроком, которому нанесли урон.
private Is_Dynamic = true //Если этот параметр равен true, то изменение некоторых предыдущих параметров будет доступно ДИНАМИЧЕСКИ,
//т.е. во время игры, путём присвоения переменным с аналогичным названием необходимых свойств.
//Например: SDMS_D_Font_Size = 10.
/*Доступные для изменения параметры:
SDMS_D_Font_Size
SDMS_D_Life_Time
SDMS_D_Prev_Text
SDMS_D_Next_Text
SDMS_D_Not_Display_On_Fog_Of_War
SDMS_D_Display_Type
SDMS_D_Color[0-14] <-- массив строк, отвечающий за цвета соответствующих игроков;
пример: SDMS_Color[5] = "|c00fe8a0e"
*/
/*==================================================
=====================Система=======================
===================================================*/
//Изменение дальнейшего кода не рекомендуется
}
//Глобальные переменные
private trigger Trg = CreateTrigger()
#if Is_Dynamic
public float D_Font_Size = Font_Size
public float D_Life_Time = Life_Time
public string D_Prev_Text = Prev_Text
public string D_Next_Text = Next_Text
public bool D_Not_Display_On_Fog_Of_War = Not_Display_On_Fog_Of_War
public int D_Display_Type = Display_Type
string array SDMS_D_Color
#if IsDebug
private trigger ChatEvent = CreateTrigger()
#endif
#else
private string Sds[14]
#endif
define private Error(sx) = {DisplayTimedTextToPlayer(GetLocalPlayer(),0.,0.,60.,"|cffff0000Error!|r |cff990000"+sx+"|r")}
define private Chat(i) = {TriggerRegisterPlayerChatEvent(ChatEvent, Player(i), "", false)}
define private NeedFunc1 = {
private string GetSpecColor(player Ad, player Ar, player You) {
if Ad == You {
if Ar == You {return ColorS+scYY}
elseif IsPlayerAlly(Ar, You) {return ColorS+scYA}
elseif IsPlayerEnemy(Ar, You) {return ColorS+scYE}
} elseif IsPlayerAlly(Ad, You) {
if Ar == You {return ColorS+scAY}
elseif IsPlayerAlly(Ar, You) {return ColorS+scAA}
elseif IsPlayerEnemy(Ar, You) {return ColorS+scAE}
} elseif IsPlayerEnemy(Ad, You) {
if Ar == You {return ColorS+scEY}
elseif IsPlayerAlly(Ar, You) {return ColorS+scEA}
elseif IsPlayerEnemy(Ar, You) {return ColorS+scEE}
}
return ""
}
}
#if Display_Type == 3
#if Is_Dynamic == false
NeedFunc1
#endif
#endif
#if Is_Dynamic
#if Display_Type != 3
NeedFunc1
#else
NeedFunc1
#endif
#endif
private texttag CreateFloatingTextTagAboveUnit(string Text, real Size, unit TargetUnit, real LifeTime) {
texttag tt = CreateTextTag(); SetTextTagText(tt, Text, Size*.0023); SetTextTagPosUnit(tt, TargetUnit, 20.)
SetTextTagVelocity(tt, .05325*Cos(1.570795), .05325*Sin(1.570795))
SetTextTagPermanent(tt, false); SetTextTagLifespan(tt, LifeTime); SetTextTagFadepoint(tt, 0.)
return tt}
private void MainFunc() {
unit Ad = GetTriggerUnit()
unit Ar = GetEventDamageSource()
real Dmg = GetEventDamage()
texttag Tt = null
int i = 0
if Dmg != 0 {
#if Is_Dynamic
if D_Display_Type == 1 {
Tt = CreateFloatingTextTagAboveUnit(SDMS_D_Color[GetPlayerId(GetOwningPlayer(Ad))]+D_Prev_Text+I2S(R2I(Dmg))+D_Next_Text+"|r", D_Font_Size, Ad, D_Life_Time)}
elseif D_Display_Type == 2 {
Tt = CreateFloatingTextTagAboveUnit(SDMS_D_Color[GetPlayerId(GetOwningPlayer(Ar))]+D_Prev_Text+I2S(R2I(Dmg))+D_Next_Text+"|r", D_Font_Size, Ad, D_Life_Time)}
else {
whilenot(i == 15) {
if GetPlayerController(Player(i)) == MAP_CONTROL_USER and GetPlayerSlotState(Player(i)) == PLAYER_SLOT_STATE_PLAYING {
Tt = CreateFloatingTextTagAboveUnit(GetSpecColor(GetOwningPlayer(Ad), GetOwningPlayer(Ar), Player(i))+D_Prev_Text+I2S(R2I(Dmg))+D_Next_Text+"|r", D_Font_Size, Ad, D_Life_Time)
if D_Not_Display_On_Fog_Of_War {
SetTextTagVisibility(Tt, false)
if IsUnitVisible(Ad, Player(i)) and Player(i) == GetLocalPlayer() {
SetTextTagVisibility(Tt, true)
}
} else {
SetTextTagVisibility(Tt, false)
if Player(i) == GetLocalPlayer() {
SetTextTagVisibility(Tt, true)
}
}
}
i ++
}
}
i = 0
if D_Not_Display_On_Fog_Of_War and D_Display_Type != 3 {
SetTextTagVisibility(Tt, false)
whilenot(i == 15) {
if GetPlayerController(Player(i)) == MAP_CONTROL_USER and GetPlayerSlotState(Player(i)) == PLAYER_SLOT_STATE_PLAYING and IsUnitVisible(Ad, Player(i)) and Player(i) == GetLocalPlayer() {
SetTextTagVisibility(Tt, true)
}
i ++
}
}
#else
#if Display_Type
Tt = CreateFloatingTextTagAboveUnit(Sds[GetPlayerId(GetOwningPlayer(Ad))]+Prev_Text+I2S(R2I(Dmg))+Next_Text+"|r", Font_Size, Ad, Life_Time)
#elseif Display_Type == 2
Tt = CreateFloatingTextTagAboveUnit(Sds[GetPlayerId(GetOwningPlayer(Ar))]+Prev_Text+I2S(R2I(Dmg))+Next_Text+"|r", Font_Size, Ad, Life_Time)
#else
whilenot(i == 15) {
if GetPlayerController(Player(i)) == MAP_CONTROL_USER and GetPlayerSlotState(Player(i)) == PLAYER_SLOT_STATE_PLAYING {
Tt = CreateFloatingTextTagAboveUnit(GetSpecColor(GetOwningPlayer(Ad), GetOwningPlayer(Ar), Player(i))+Prev_Text+I2S(R2I(Dmg))+Next_Text+"|r", Font_Size, Ad, Life_Time)
#if Not_Display_On_Fog_Of_War
SetTextTagVisibility(Tt, false)
if IsUnitVisible(Ad, Player(i)) and Player(i) == GetLocalPlayer() {
SetTextTagVisibility(Tt, true)
}
#else
SetTextTagVisibility(Tt, false)
if Player(i) == GetLocalPlayer() {
SetTextTagVisibility(Tt, true)
}
#endif
}
i ++
}
#endif
i = 0
#if Not_Display_On_Fog_Of_War
#if Display_Type
SetTextTagVisibility(Tt, false)
whilenot(i == 15) {
if GetPlayerController(Player(i)) == MAP_CONTROL_USER and GetPlayerSlotState(Player(i)) == PLAYER_SLOT_STATE_PLAYING and IsUnitVisible(Ad, Player(i)) and Player(i) == GetLocalPlayer() {
SetTextTagVisibility(Tt, true)
}
i ++
}
#else
SetTextTagVisibility(Tt, false)
whilenot(i == 15) {
if GetPlayerController(Player(i)) == MAP_CONTROL_USER and GetPlayerSlotState(Player(i)) == PLAYER_SLOT_STATE_PLAYING and IsUnitVisible(Ad, Player(i)) and Player(i) == GetLocalPlayer() {
SetTextTagVisibility(Tt, true)
}
i ++
}
#endif
#endif
#endif
}
Ad = null; Ar = null; Tt = null
}
#if IsDebug
#if Is_Dynamic //О_О ^_^ хорошо, что комменты не компилируются
private void ChatFunc() {
string s = GetEventPlayerChatString()
if SubString(s, 0, 3) == "-fs" {
D_Font_Size = S2I(SubString(s, 4, StringLength(s)))
if D_Font_Size <= 0 {Error("Размер шрифта неверный!"); D_Font_Size = Font_Size}
} elseif SubString(s, 0, 3) == "-pt" {
D_Prev_Text = SubString(s, 4, StringLength(s))
} elseif SubString(s, 0, 3) == "-nt" {
D_Next_Text = SubString(s, 4, StringLength(s))
} elseif SubString(s, 0, 3) == "-lt" {
D_Life_Time = S2I(SubString(s, 4, StringLength(s)))
if D_Life_Time <= 0 {Error("Время жизни высплывающего урона неверно!"); D_Life_Time = Life_Time}
} elseif SubString(s, 0, 3) == "-dt" {
D_Display_Type = S2I(SubString(s, 4, StringLength(s)))
if D_Display_Type != 1 and D_Display_Type != 2 and D_Display_Type != 3 {Error("Тип отображения урона неверный!"); D_Display_Type = Display_Type}
} elseif SubString(s, 0, 3) == "-hd" {
if S2I(SubString(s, 4, StringLength(s))) == 1 {
D_Not_Display_On_Fog_Of_War = true
} elseif S2I(SubString(s, 4, StringLength(s))) == 0 {
D_Not_Display_On_Fog_Of_War = false
}
}
}
#endif
#endif
private void EnterTrigger() {TriggerRegisterUnitEvent(Trg, GetEnteringUnit(), EVENT_UNIT_DAMAGED)}
private void EnumGroup() {TriggerRegisterUnitEvent(Trg, GetEnumUnit(), EVENT_UNIT_DAMAGED)}
private void Init() {
TriggerAddAction(Trg, function MainFunc)
region R = CreateRegion(); RegionAddRect(R, GetWorldBounds())
trigger tr = CreateTrigger(); TriggerRegisterEnterRegion(tr, R, null); TriggerAddAction(tr, function EnterTrigger); R = null; tr = null
group gr = CreateGroup(); GroupEnumUnitsInRect(gr, GetWorldBounds(), null); ForGroup(gr, function EnumGroup); DestroyGroup(gr); gr = null
#if Is_Dynamic
SDMS_D_Color[0] = ColorS+Color0; SDMS_D_Color[1] = ColorS+Color1; SDMS_D_Color[2] = ColorS+Color2
SDMS_D_Color[3] = ColorS+Color3; SDMS_D_Color[4] = ColorS+Color4; SDMS_D_Color[5] = ColorS+Color5
SDMS_D_Color[6] = ColorS+Color6; SDMS_D_Color[7] = ColorS+Color7; SDMS_D_Color[8] = ColorS+Color8
SDMS_D_Color[9] = ColorS+Color9; SDMS_D_Color[10] = ColorS+Color10; SDMS_D_Color[11] = ColorS+Color11
SDMS_D_Color[12] = ColorS+Color12; SDMS_D_Color[13] = ColorS+Color13; SDMS_D_Color[14] = ColorS+Color14
#else
Sds[0] = ColorS+Color0; Sds[1] = ColorS+Color1; Sds[2] = ColorS+Color2
Sds[3] = ColorS+Color3; Sds[4] = ColorS+Color4; Sds[5] = ColorS+Color5
Sds[6] = ColorS+Color6; Sds[7] = ColorS+Color7; Sds[8] = ColorS+Color8
Sds[9] = ColorS+Color9; Sds[10] = ColorS+Color10; Sds[11] = ColorS+Color11
Sds[12] = ColorS+Color12; Sds[13] = ColorS+Color13; Sds[14] = ColorS+Color14
#endif
}
}
Копируйте и проверьте на наличие знаков вопроса. При наличии таковых (мб баг форума или браузеров) удалите их. Проверяйте)