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

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

Ответ
 
MegaBlax

offline
Опыт: 2,352
Активность:
Моя первая бомба (посмотрите код)
Посмотрите пожалуйста мой код. Принцип действия: игрок берет предмет, по истечению 10 секунд он взрывается.
Скажите что можно было сделать по другому, где я перемудрил.
((кат код cJass
((код jass
scope B initializer InitB {
define {
private sfx="war3mapImported\\SuperBigExplosion.mdx"
private H2I(h)=GetHandleId(h)
private void=nothing
private bool=boolean
private int=integer
private Fil=GetFilterUnit()
private Life=UNIT_STATE_LIFE
private Trigger=GetTriggeringTrigger()
}
private bool MR() {
trigger t=Trigger
int i=H2I(t)
unit u=LoadUnitHandle(h,i,1)
if IsUnitEnemy(Fil,GetOwningPlayer(u)) and IsUnitType(Fil,UNIT_TYPE_STRUCTURE)==false and GetUnitState(Fil,Life)>0{
UnitDamageTarget(u,Fil,1000,false,false,null,null,null)
}
t=null
u=null
return false
}
private bool ME() {
trigger t=Trigger
int i=H2I(t),c=LoadInteger(h,i,2)
unit u=LoadUnitHandle(h,i,1)
triggercondition con=LoadTriggerConditionHandle(h,i,3)
group g=CreateGroup()
real x=GetUnitX(u),y=GetUnitY(u),r=450.
texttag tt=LoadTextTagHandle(h,i,4)
effect e
item it=LoadItemHandle(h,i,5)
if c>0{
DestroyTextTag(tt)
c--
tt = CreateTextTagLocBJ("|cFFFF0303"+I2S(c)+"|r",Location(x,y),10.,13.,100,100,100,0)​
SetTextTagVelocityBJ(tt,64,90)
SaveTextTagHandle(h,i,4,tt)
SaveInteger(h,i,2,c)
}else{
GroupEnumUnitsInRange(g,x,y,r,Condition(function MR))
GroupClear(g)
DestroyGroup(g)
TriggerRemoveCondition(GetTriggeringTrigger(),con)
DestroyTextTag(tt)
e=AddSpecialEffect(sfx,x,y)
DestroyEffect(e)
RemoveItem(it)
KillUnit(u)
}
tt=null
t=null
u=null
con=null
g=null
return false
}
private void MW() {
trigger t=CreateTrigger()
unit u=GetTriggerUnit()
int i=H2I(t),c=10
triggercondition con
texttag tt
real x=GetUnitX(u),y=GetUnitY(u)
item it=GetManipulatedItem()
tt=CreateTextTagLocBJ("|cFFFF0303"+I2S(c)+"|r",Location(x,y),10.,13.,100,100,100​,0)
SetTextTagVelocityBJ(tt,64,90)
TriggerRegisterTimerEvent(t,1.,true)
con=TriggerAddCondition(t,Condition(function ME))
SaveUnitHandle(h,i,1,u)
SaveInteger(h,i,2,c)
SaveTriggerConditionHandle(h,i,3,con)
SaveTextTagHandle(h,i,4,tt)
SaveItemHandle(h,i,5,it)
t=null
u=null
con=null
tt=null
}
private bool MQ() {
if GetItemTypeId(GetManipulatedItem())=='desc' {
MW()
}
return false
}
private void InitB() {
trigger t=CreateTrigger()
Preload(sfx)
TriggerRegisterAnyUnitEventBJ(t,EVENT_PLAYER_UNIT_PICKUP_ITEM)
TriggerAddCondition(t,Condition(function MQ))
t=null
}
}
))
))
((кат код jass
((код jass
формула вычисления высоты z=(высота * 0.023 / 10)
формуа вычисления скорости текста s=(скорость * 0.071 / 128)
s*Cos(angle*bj_DEGTORAD)
s*Sin(angle*bj_DEGTORAD)
globals
hashtable gc=InitHashtable()
integer item_id='desc'
unit Un
string sfx="war3mapImported\\SuperBigExplosion.mdx"
endglobals
function MG takes nothing returns boolean
local unit f=GetFilterUnit()
if IsUnitEnemy(f,GetOwningPlayer(Un)) and IsUnitType(f,UNIT_TYPE_STRUCTURE)==false and GetUnitState(f,UNIT_STATE_LIFE)>0 then
call UnitDamageTarget(Un,f,1000,false,false,null,null,null)
endif
set f=null
return false
endfunction
function M5 takes nothing returns nothing
local timer t=GetExpiredTimer()
local integer i=GetHandleId(t)
local unit u=LoadUnitHandle(gc,i,1)
local item it=LoadItemHandle(gc,i,2)
local integer c=LoadInteger(gc,i,3)
local texttag tt=LoadTextTagHandle(gc,i,4)
local real x=GetUnitX(u)
local real y=GetUnitY(u)
local group g=CreateGroup()
local effect e
if c>0 then
call DestroyTextTag(tt)
set c=c-1
call CreateTextTag()
call SetTextTagText(tt,"|cFFFF0303"+I2S(c)+"|r",0.0299)
call SetTextTagPos(tt,x,y,10)
call SetTextTagColor(tt,255,255,255,100)
call SetTextTagVelocity(tt,0,0.035)
call SaveInteger(gc,i,3,c)
call SaveTextTagHandle(gc,i,4,tt)
else
set Un=u
call GroupEnumUnitsInRange(g,x,y,450.,Condition(function MG))
call KillTimer(t)
call DestroyTextTag(tt)
set e=AddSpecialEffect(sfx,x,y)
call DestroyEffect(e)
call RemoveItem(it)
call UnitDamageTarget(u,u,99999,false,false,null,null,null)
set Un=null
call FlushChildHashtable(gc,i)
endif
call GroupClear(g)
call DestroyGroup(g)
set t=null
set u=null
set it=null
set tt=null
set e=null
set g=null
endfunction
function Boom_Con takes nothing returns boolean
local unit u
local timer t
local integer i
local item it
local integer c
local texttag tt
local real x
local real y
if GetItemTypeId(GetManipulatedItem())==item_id then
set u=GetTriggerUnit()
set t=CreateTimer()
set i=GetHandleId(t)
set it=GetManipulatedItem()
set c=10
set x=GetUnitX(u)
set y=GetUnitY(u)
set tt=CreateTextTag()
call SetTextTagText(tt,"|cFFFF0303"+I2S(c)+"|r",0.0299)
call SetTextTagPos(tt,x,y,10)
call SetTextTagColor(tt,255,255,255,100)
call SetTextTagVelocity(tt,0,0.035)
call SaveUnitHandle(gc,i,1,u)
call SaveItemHandle(gc,i,2,it)
call SaveInteger(gc,i,3,c)
call SaveTextTagHandle(gc,i,4,tt)
call TimerStart(t,1.,true,function M5)
endif
set u=null
set t=null
set it=null
set tt=null
return false
endfunction
function InitTrig_Boom_Jass takes nothing returns nothing
local trigger t=CreateTrigger()
call Preload(sfx)
call TriggerRegisterAnyUnitEventBJ(t,EVENT_PLAYER_UNIT_PICKUP_ITEM)
call TriggerAddCondition(t,Condition(function Boom_Con))
set t=null
endfunction
))
))
И карта
Прикрепленные файлы
Тип файла: w3x Бомба.w3x (81.0 Кбайт, 6 просмотров )

Отредактировано MegaBlax, 02.07.2013 в 07:39.
Старый 30.06.2013, 11:02
Nerevar
I'll be back!
offline
Опыт: 18,352
Активность:
cjass
tt = CreateTextTagLocBJ("|cFFFF0303"+I2S(c)+"|r",Location(x,y),10.,13.,100,100,100,0)​​
trigger t=CreateTrigger()
TriggerRegisterTimerEvent(t,1.,true)
ужасный,ужасный код,еще и на сжассе
+ в функции MW() не обнулил предмет
Nerevar добавил:
мои глаза(
и почему каждый первый сжассовый код так по-извращенски выглядит(особенно в блоке дефайнов и дальше в коде в месте их применения)? еще и автор лезет в него побыстрее,не до конца вкурив о утечках
Старый 30.06.2013, 11:18
MegaBlax

offline
Опыт: 2,352
Активность:
Nerevar, какие еще утечки кроме не обнуленой функции?
Старый 30.06.2013, 11:27
Nerevar
I'll be back!
offline
Опыт: 18,352
Активность:
Nerevar:
Location(x,y)
+использование периодик триггера вместо простого таймера
+триггер не дестроится
+таблица не чистится
Старый 30.06.2013, 11:30
MegaBlax

offline
Опыт: 2,352
Активность:
Ну насчет Location(x,y) понятно. То есть вместо TriggerRegisterTimerEvent(t,1.,true) лучше использовать таймер?
Старый 30.06.2013, 11:32
Алексей Андреич
..."№%;№;?345...
offline
Опыт: 80,420
Активность:
MegaBlax:
лучше
Старый 30.06.2013, 11:40
Goodie

offline
Опыт: 2,825
Активность:
лучше использовать таймер?
Обязательно
Старый 30.06.2013, 18:17
DioD

offline
Опыт: 45,134
Активность:
если вы хотели сделать код нечитаемым у вас получилось, начинать надо с чистого жаса.
Старый 30.06.2013, 19:06
Goodie

offline
Опыт: 2,825
Активность:
или же с vJass, синтаксисом он практически не отличается
Старый 30.06.2013, 20:31
adic3x

offline
Опыт: 108,439
Активность:
если вы хотели сделать код нечитаемым у вас получилось, начинать надо с чистого жаса.
Я, кстати, так не считаю. Это как предлагать начинать изучать программирование с АСМ. По коду - давайте нормальные, развернутые имена переменный и функциям.
Старый 30.06.2013, 23:30
MegaBlax

offline
Опыт: 2,352
Активность:
Переписал на jass убрал утечки
((кат код
((код jass
формула вычисления высоты z=(высота * 0.023 / 10)
формуа вычисления скорости текста s=(скорость * 0.071 / 128)
s*Cos(angle*bj_DEGTORAD)
s*Sin(angle*bj_DEGTORAD)
globals
hashtable gc=InitHashtable()
integer item_id='desc'
unit Un
string sfx="war3mapImported\\SuperBigExplosion.mdx"
endglobals
function MG takes nothing returns boolean
local unit f=GetFilterUnit()
if IsUnitEnemy(f,GetOwningPlayer(Un)) and IsUnitType(f,UNIT_TYPE_STRUCTURE)==false and GetUnitState(f,UNIT_STATE_LIFE)>0 then
call UnitDamageTarget(Un,f,1000,false,false,null,null,null)
endif
set f=null
return false
endfunction
function M5 takes nothing returns nothing
local timer t=GetExpiredTimer()
local integer i=GetHandleId(t)
local unit u=LoadUnitHandle(gc,i,1)
local item it=LoadItemHandle(gc,i,2)
local integer c=LoadInteger(gc,i,3)
local texttag tt=LoadTextTagHandle(gc,i,4)
local real x=GetUnitX(u)
local real y=GetUnitY(u)
local group g=CreateGroup()
local effect e
if c>0 then
call DestroyTextTag(tt)
set c=c-1
call CreateTextTag()
call SetTextTagText(tt,"|cFFFF0303"+I2S(c)+"|r",0.0299)
call SetTextTagPos(tt,x,y,10)
call SetTextTagColor(tt,255,255,255,100)
call SetTextTagVelocity(tt,0,0.035)
call SaveInteger(gc,i,3,c)
call SaveTextTagHandle(gc,i,4,tt)
else
set Un=u
call GroupEnumUnitsInRange(g,x,y,450.,Condition(function MG))
call KillTimer(t)
call DestroyTextTag(tt)
set e=AddSpecialEffect(sfx,x,y)
call DestroyEffect(e)
call RemoveItem(it)
call UnitDamageTarget(u,u,99999,false,false,null,null,null)
set Un=null
call FlushChildHashtable(gc,i)
endif
call GroupClear(g)
call DestroyGroup(g)
set t=null
set u=null
set it=null
set tt=null
set e=null
set g=null
endfunction
function Boom_Con takes nothing returns boolean
local unit u
local timer t
local integer i
local item it
local integer c
local texttag tt
local real x
local real y
if GetItemTypeId(GetManipulatedItem())==item_id then
set u=GetTriggerUnit()
set t=CreateTimer()
set i=GetHandleId(t)
set it=GetManipulatedItem()
set c=10
set x=GetUnitX(u)
set y=GetUnitY(u)
set tt=CreateTextTag()
call SetTextTagText(tt,"|cFFFF0303"+I2S(c)+"|r",0.0299)
call SetTextTagPos(tt,x,y,10)
call SetTextTagColor(tt,255,255,255,100)
call SetTextTagVelocity(tt,0,0.035)
call SaveUnitHandle(gc,i,1,u)
call SaveItemHandle(gc,i,2,it)
call SaveInteger(gc,i,3,c)
call SaveTextTagHandle(gc,i,4,tt)
call TimerStart(t,1.,true,function M5)
endif
set u=null
set t=null
set it=null
set tt=null
return false
endfunction
function InitTrig_Boom_Jass takes nothing returns nothing
local trigger t=CreateTrigger()
call Preload(sfx)
call TriggerRegisterAnyUnitEventBJ(t,EVENT_PLAYER_UNIT_PICKUP_ITEM)
call TriggerAddCondition(t,Condition(function Boom_Con))
set t=null
endfunction
))
))
Старый 01.07.2013, 10:02
Doc

offline
Опыт: 63,163
Активность:
Да все нормально...
IsUnitType(f,UNIT_TYPE_STRUCTURE)==false
Не обязательно.
Перебор по группе можно было локальный сделать но тоже необязательно.
Есть какая-то конкретная проблема?
Если пишешь на cjass там есть специальная
for (Unit unit: UnitsInRange(x, y, radius)){
}
конструкция.
Старый 01.07.2013, 10:31
MegaBlax

offline
Опыт: 2,352
Активность:
((цитата
Есть какая-то конкретная проблема?
))
Не, просто хотел узнать все ли я правильно делаю. Может где-то слишком перемудрил и т.д.
((цитата
Если пишешь на cjass там есть специальная
))
Это был мой первый опыт cjass. Я еще много чего не знаю.
Старый 01.07.2013, 10:41
Doc

offline
Опыт: 63,163
Активность:
Короче все нормально, только имена переменным лучше давать подлиннее, хотя хз наверное в JNGP тяжко их писать каждый раз.
Старый 01.07.2013, 10:46
MegaBlax

offline
Опыт: 2,352
Активность:
Doc, я привык уже просто
Старый 01.07.2013, 10:55
DioD

offline
Опыт: 45,134
Активность:
Я, кстати, так не считаю.
вы считаете неверно и сравниваете жопу с пальцем, начнём с того что все эти надстройки рак который даёт только иллюзию всех этих возможностей, а не сами возможности.
Старый 01.07.2013, 11:56
MpW

offline
Опыт: 49,815
Активность:
Для взломщика ваши читаемые коды хорошо, не читаемые плохо) главное самому понять что ль, у меня вот есть чужие коды, не могу разобраться в чужой работе
Steal nerves добавил:
так как работу делал автор мне тяжело разобраться в работе кучи триггеров
Старый 01.07.2013, 14:16
MegaBlax

offline
Опыт: 2,352
Активность:
Steal_nerves, да там вообще все ясно и понятно. Особнео во втором варианте.
Старый 02.07.2013, 07:40
DioD

offline
Опыт: 45,134
Активность:
текстаги обнулять не стоит, они не настоящие хендлы, также они не сохраняются в сейв и еще некоторые с ними особенности, лучше их вообще нигде не таскать и делать опциональными.
создавать переменные которые вы используете только один раз рак полный, getTriggeringUnit() статик, для неё переменную делать только если вы хотите длину кода уменьшить, иначе метить к инлайну.
Такие спеллы делаются следующим образом:
  1. Вы создаёте структуру или пишите менеджер памяти который собирает вам структуры в рантайме.
  2. Держите таймер который всегда есть и непрерывно обрабатывает существующие структуры.
  3. Структура это набор глобальных массивов, соответственно кеш использовать совершенно нет никакой необходимости, все указатели у вас уже сохранены там где надо.
эта методика называется карусель, в языках которые разрешают иметь много потоков, а еще в ядре виндоус и многих других местах применяется именно она.
надо будет какнить пример запилить про это.
Старый 02.07.2013, 13:44
adic3x

offline
Опыт: 108,439
Активность:
вы считаете неверно и сравниваете жопу с пальцем, начнём с того что все эти надстройки рак который даёт только иллюзию всех этих возможностей, а не сами возможности.
Да ну, а любые другие языки ведь тоже дают такую-же иллюзию, ведь в любом случае компьютер исполняет машинный код?
Старый 07.07.2013, 01:48
Ответ

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

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

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

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



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