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

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

Ответ
 
adic3x

offline
Опыт: 108,439
Активность:
Lightning Mage (vJass spells)
Герой, полностью укомплектованый 4 тригерными магиями на тему Молний. Хотя если честно я по понятным причинам не тестил это в обьеме, необходимом для полного обезбаживание, но думаю работает нормально.

Предыстория



Вообщето давно придумал нечто подобное. Кто помнит игрушку герои 3, так вот там была такая фракция как "Башня". И был там такой класс героя как "Маг".

И вот мну вдруг озарило, что Архимаг из Варика оч. похож внешне на магов из третих героев. И вспомнил я, что была там такая имбовая скотина, как Соломир (кажется так его звали), который с первого уровня весьма весело раскидивался цеповушками...

Пару слов о коде



Написанно все на vJass, соответсвенно обычным редактором это не скопируешь. Я использовал исключительно таймеры для действий с отсрочкой, и систему Тс XAT как заменитель кеша, от которого я тоже отказался. Вроде все. Качаем, смотрим, коментим=)
Прикрепленные файлы
Тип файла: w3x Lightning Mage.w3x (49.5 Кбайт, 126 просмотров )

Отредактировано ADOLF, 15.09.2007 в 17:51.
Старый 15.09.2007, 17:45
J
expert
offline
Опыт: 48,447
Активность:
молодец, неплохо)
хотя эта сумашедшая молния вроде бы тупой спел=/... сам по себе по определению...

Jon добавил:
непонял... это с каких пор принято рав коды абилок переводить в десятизначные системы исчасления?
-1

Jon добавил:
фух.. а я уж думал ты и приказы отдаеш через id код приказа)

Jon добавил:
зачем проверять здоревье юнита относительно 0,405? гораздо проще опирацо на 0, всеравно никакой разницы...
ну.. некоторые переменные можно было бы необнулять.. хотя пох.. безразницы

это твой стиль письма и делай как хош, но называть локальные переменые одной буквой это изврат... делай более полные названия, чтобы в коде мог разобратся любой нуб... в рамках програмирования вообще принято еще в названии переменой указывать тип переменой и глоб/локал, в обычном джаз это указывалось udg_, но в vJass отличать переменые сложновато...

Jon добавил:
используй в функцих тригера когда проверяш левел абилки или т.п. функцию GetSpellAbilityId(), вместо рав кода абилки, это упрощает ипортирование

Jon добавил:
ADOLF хороший совет - не делай так чтобы сложно было разобратся, делай так чтобы все было максимально понятно и доступно, ты же делаеш не для себя а для общества, раз выложыл сдесь
Именно в этом отличее тех кто выложил спелл для массы, и тех кто выложил чтобы покрасоватся и показать свои возможности

P.S.
твоя попытка попасть в наш клуб задротов почти удалась)

Отредактировано Jon, 15.09.2007 в 19:19.
Старый 15.09.2007, 18:50
df Hunter
Нападатель
offline
Опыт: 5,749
Активность:
Цитата:
это твой стиль письма и делай как хош, но называть локальные переменые одной буквой это изврат...

нормально)
Цитата:
непонял... это с каких пор принято рав коды абилок переводить в десятизначные системы исчасления?
-1

протект ))))) но для сэмплов не катит ), да и ваще не катит, только время депротекта увеличивает
Цитата:
Соломир (кажется так его звали)

Солмир
Цитата:
Jon добавил:
используй в функцих тригера когда проверяш левел абилки или т.п. функцию GetSpellAbilityId(), вместо рав кода абилки, это упрощает ипортирование

да равкоды вообще весело юзать :D
Цитата:
как заменитель кеша, от которого я тоже отказался

а я чёто посчитал, прикинул и решил что системы всякие не решают сильно по сравнению с кэшем, то есть 1-2 записи/считывания можно себе позволить в функции чем чё-то там задрачивать
так как разница: 0.00002(КЭШ) и 0.000001(массив) конечно есть, но в системах действий то с массивами больше (В ХАТ по тестам Тс 0.000008, в 8 раз медленней обычного массива и в 2.25 быстрей КЭША), а кэш слишком уж МУИ
это моё имхо и мне пох
Старый 15.09.2007, 19:17
J
expert
offline
Опыт: 48,447
Активность:
Цитата:
а я чёто посчитал, прикинул и решил что системы всякие не решают сильно по сравнению с кэшем, то есть 1-2 записи/считывания можно себе позволить в функции чем чё-то там задрачивать

тру)
Старый 15.09.2007, 19:19
Toadcop

offline
Опыт: 54,313
Активность:
looks sexy ^^ вообщем норм *thumb up*

Цитата:
зачем проверять здоревье юнита относительно 0,405? гораздо проще опирацо на 0, всеравно никакой разницы...
false

Цитата:
Именно в этом отличее тех кто выложил спелл для массы, и кто выложил чтобы показать свои возможности
он показал возможности vJass вот я лично всё отлично понял =) мне вот такой вид кода куда ближе чем куча бредо табуляций + в конечно случаи этот код и так некому не нужен а кому надо в нём разберётьса =)

ADOLF +1 =) почему ? оч прилично делает террайны и кодит нормальною (это еще мин) и не пишет я джассер или подобный крап... вот я лвл дизайнер xD

Отредактировано Кет, 15.09.2007 в 21:56.
Старый 15.09.2007, 20:07
Кет

offline
Опыт: 111,109
Активность:
Удалил ругательства.
Просьба не продолжать, комментарии только по теме.

---
С уважением, Кет.

Отредактировано Кет, 15.09.2007 в 22:50.
Старый 15.09.2007, 21:57
adic3x

offline
Опыт: 108,439
Активность:
Jon, если ты еще не понял, что каждый кодит как ему удобно, к примеру ты ставишь кучу пробелов, что бы тебе код казался более читаемым, это не значит, что он будет казаться более читаемым всем.
Цитата:
делай более полные названия, чтобы в коде мог разобратся любой нуб
код писался с расчетом, что нуб в нем ну никак не разбереццо, а не нуб легко.
Цитата:
твоя попытка попасть в наш клуб задротов почти удалась)
хм...
Цитата:
Солмир
неполенился зашел - в одном переводе Сольмир, в другом Солмир, ладно, я нагнал;)
Цитата:
то есть 1-2 записи/считывания можно себе позволить в функции чем чё-то там задрачивать
дык кешь это и есть задротство^_^

Toadcop, df Hunter - thx=) ну и жонику тоже=)

Отредактировано ADOLF, 16.09.2007 в 10:35.
Старый 16.09.2007, 10:17
J
expert
offline
Опыт: 48,447
Активность:
Цитата:
Сообщение от ADOLF
Jon, если ты еще не понял, что каждый кодит как ему удобно
Цитата:
Сообщение от Jon
это твой стиль письма и делай как хош
Старый 16.09.2007, 10:50
df Hunter
Нападатель
offline
Опыт: 5,749
Активность:
Цитата:
Jon, если ты еще не понял, что каждый кодит как ему удобно, к примеру ты ставишь кучу пробелов, что бы тебе код казался более читаемым, это не значит, что он будет казаться более читаемым всем.

кстати прав
мне например проще написать local lightning g или local integer i чем local lightning BASEMOVElightning или local integer counter и читать впринципе проще i чем counter
Старый 16.09.2007, 11:04
Toadcop

offline
Опыт: 54,313
Активность:
df Hunter конечно это еще вопрос размера кода + скорости его написания + запоминания названий короче с коротких названий ТОКА одни +ы =) но для глобалок я люблю извращатьса =) типо
TcXConfig_sync_stringval или TCM_bot_powerups_check_per =) т.е. разделать _ слова и желаетльно ловеркейс т.к. так проще пичатать.

Jon то что нравитьса тебе != нравитьса другим. + сам вопрос написания кода очень тупой важен ТОЛЬКО результат ! я вот люблю юзать для нумерации масивох чука х и циферог напр =) в том же ХАТ это видно... и мне нравитьса кодить юзая сви регистры.

вот ориг код из ТсХ ~1.02

Код:
function TCM_CollisionPierceCheck takes nothing returns boolean
   local xunit xux
   set bux10=GetFilterUnit()
   set xux=GetUnitUserData(bux10)
if mmx.b06 then
 if s__xunit_team[GetUnitUserData(mmx.parent)]!=xux.team then
 if xux.creep then
   set xux.x=GetUnitX(bux10)
   set xux.y=GetUnitY(bux10)
   set xux.z=GetUnitZ(bux10)
 endif
if xux.nocorpse==false and bbx00==false then
if mmx.z>xux.z-xux.Zmin and mmx.z<xux.z+xux.Zmax then
if not IsUnitInGroup(bux10,mmx.dmged) then
 if bux10!=mmx.parent then
   set bux20=bux10
   call TCM_Dmg(mmx.parent,bux10,mmx.dmg,mmx.x,mmx.y,mmx.z)
   call GroupAddUnit(mmx.dmged,bux10)
  if GetRandomReal(0.001,100)>mmx.r08 then
   set bbx00=true
  endif
 elseif mmx.dmgparent then
   set bux20=bux10
   call TCM_Dmg(mmx.parent,bux10,mmx.dmg,mmx.x,mmx.y,mmx.z)
   call GroupAddUnit(mmx.dmged,bux10)
  if GetRandomReal(0.001,100)>mmx.r08 then
   set bbx00=true
  endif
 endif
endif
   call GroupAddUnit(TCM_dmged,bux10)
   set bbx01=true
endif
endif
 endif
else
 if xux.creep then
   set xux.x=GetUnitX(bux10)
   set xux.y=GetUnitY(bux10)
   set xux.z=GetUnitZ(bux10)
 endif
if xux.nocorpse==false and bbx00==false then
if mmx.z>xux.z-xux.Zmin and mmx.z<xux.z+xux.Zmax then
if not IsUnitInGroup(bux10,mmx.dmged) then
 if bux10!=mmx.parent then
   set bux20=bux10
   call TCM_Dmg(mmx.parent,bux10,mmx.dmg,mmx.x,mmx.y,mmx.z)
   call GroupAddUnit(mmx.dmged,bux10)
  if GetRandomReal(0.001,100)>mmx.r08 then
   set bbx00=true
  endif
 elseif mmx.dmgparent then
   set bux20=bux10
   call TCM_Dmg(mmx.parent,bux10,mmx.dmg,mmx.x,mmx.y,mmx.z)
   call GroupAddUnit(mmx.dmged,bux10)
  if GetRandomReal(0.001,100)>mmx.r08 then
   set bbx00=true
  endif
 endif
endif
   call GroupAddUnit(TCM_dmged,bux10)
   set bbx01=true
endif
endif
endif
   return false
endfunction

...

function TCMX_XunitMoveAct takes unit u returns nothing
   local xunit xux=GetUnitUserData(u)
   local real mvs=0
   local real mhg=0
   local real mtp=0
   local real rrx=TCMX_UpdatePeriod*(TCM_dt*xux.timeX+xux.timeXval)
 if xux.hwref<1 then
   set xux.hwref=0
   set xux.hwmaxz=0
   set xux.hwminz=0
 endif
   set mhg=GetUnitFlyHeight(u)
if xux.hwmaxz!=0 and mhg>0.5 then
   set bbx00=xux.z<=xux.hwmaxz+xux.Zsize
   set xux.Zdiff=xux.z-xux.hwmaxz
 if bbx00 then
  if xux.direction>0 then
   set mvs=xux.speed*xux.speedbonus
   set xux.veclastx=mvs*Cos(xux.direction*0.0175)
   set xux.veclasty=mvs*Sin(xux.direction*0.0175)
  else
   set xux.veclastx=0
   set xux.veclasty=0
  endif
   set xux.veclast2x=0
   set xux.veclast2y=0
 else
  if xux.direction>0 then
   set mvs=(xux.speed*xux.speedbonus)*rrx*AirControl
   set xux.vecx=xux.vecx+mvs*Cos(xux.direction*0.0175)
   set xux.vecy=xux.vecy+mvs*Sin(xux.direction*0.0175)
   set xux.veclast2x=0
   set xux.veclast2y=0
  endif
 endif
   set xux.vecx=xux.vecx+(xux.vecfx*rrx)
   set xux.vecy=xux.vecy+(xux.vecfy*rrx)
   set xux.vecz=xux.vecz+(((GravityZ*xux.gravityX+xux.gravityXval+xux.vecfz)-xux.mass)*rrx)
   set xux.x=xux.x+((xux.veclastx+xux.veclast2x+xux.vecx)*rrx)
   set xux.y=xux.y+((xux.veclasty+xux.veclast2y+xux.vecy)*rrx)
   set xux.z=xux.z+(xux.vecz*rrx)
 if bbx00 then
   set xux.vecx=xux.vecx*xux.terrfriction
   set xux.vecy=xux.vecy*xux.terrfriction
   set xux.vecz=xux.vecz*xux.terrfriction
 if RAbs(xux.vecx)<minspeedtoslow then
   set xux.vecx=0
 endif
 if RAbs(xux.vecy)<minspeedtoslow then
   set xux.vecy=0
 endif
 if RAbs(xux.vecz)<minspeedtoslow then
   set xux.vecz=0
 endif
 endif
if xux.z<xux.hwmaxz then
   set xux.z=xux.hwmaxz
endif
if xux.z>MapMaxZ then
   set xux.z=MapMaxZ
   set xux.vecz=0
endif
 if MapMinUX>=xux.x or MapMaxUX<=xux.x or MapMinUY>=xux.y or MapMaxUY<=xux.y then
  if MapMinUX>=xux.x or MapMaxUX<=xux.x then
    set xux.x=GetUnitX(u)
    set xux.vecx=0
    set xux.veclastx=0
    set xux.veclast2x=0
   if MapMinUY>=xux.y or MapMaxUY<=xux.y then
    set xux.y=GetUnitY(u)
    set xux.vecy=0
    set xux.veclasty=0
    set xux.veclast2y=0
   endif
  else
    set xux.y=GetUnitY(u)
    set xux.vecy=0
    set xux.veclasty=0
    set xux.veclast2y=0
  endif
    call SetUnitX(u,xux.x)
    call SetUnitY(u,xux.y)
    call SetUnitZ(u,xux.z)
 else
   call SetUnitX(u,xux.x)
   call SetUnitY(u,xux.y)
   call SetUnitZ(u,xux.z)
 endif
 if xux.hwmaxz+xux.Zsize*rrx>=xux.z then
  if xux.direction>0 and xux.dead==false then
   call SetUnitFacing(u,xux.direction)
  endif
   call TCM_FallCheck(xux)
   set xux.vecz=-xux.mass
   set xux.z=xux.hwmaxz
 endif
   set bbx00=mhg<=xux.Zsize
   set xux.Zdiff=mhg
 if bbx00 then
  if xux.direction>0 then
   set mvs=xux.speed*xux.speedbonus
   set xux.veclastx=mvs*Cos(xux.direction*0.0175)
   set xux.veclasty=mvs*Sin(xux.direction*0.0175)
  else
   set xux.veclastx=0
   set xux.veclasty=0
  endif
   set xux.veclast2x=0
   set xux.veclast2y=0
 else
  if xux.direction>0 then
   set mvs=(xux.speed*xux.speedbonus)*rrx*AirControl
   set xux.vecx=xux.vecx+mvs*Cos(xux.direction*0.0175)
   set xux.vecy=xux.vecy+mvs*Sin(xux.direction*0.0175)
   set xux.veclast2x=0
   set xux.veclast2y=0
  endif
 endif
   set xux.vecx=xux.vecx+(xux.vecfx*rrx)
   set xux.vecy=xux.vecy+(xux.vecfy*rrx)
   set xux.vecz=xux.vecz+(((GravityZ*xux.gravityX+xux.gravityXval+xux.vecfz)-xux.mass)*rrx)
   set xux.x=xux.x+((xux.veclastx+xux.veclast2x+xux.vecx)*rrx)
   set xux.y=xux.y+((xux.veclasty+xux.veclast2y+xux.vecy)*rrx)
   set xux.z=xux.z+(xux.vecz*rrx)
 if bbx00 then
   call GetSurfaceVectorBR(GetLocationZ(MoveLocBR(tmploc,xux.x-terrsize,xux.y)),GetLocationZ(MoveLocBR(tmploc,xux.x+terrsize,xux.y)),GetLocatio  nZ(MoveLocBR(tmploc,xux.x,xux.y-terrsize)),GetLocationZ(MoveLocBR(tmploc,xux.x,xux.y+terrsize)),terrsize*2)
   set mtp=RAbs(TPCVecX)
 if mtp>terrmaxramp then
  if mtp>terrmaxramplimit then
   if xux.direction>0 then
    set xux.vecx=xux.vecx+TPCVecX*xux.terrperc*xux.terrhugeperc
   else
    set xux.vecx=xux.vecx+TPCVecX*xux.terrperc*xux.terrhugeperc*0.1
   endif
  else
   set xux.vecx=xux.vecx+TPCVecX*xux.terrperc
  endif
 endif
   set mtp=RAbs(TPCVecY)
 if mtp>terrmaxramp then
  if mtp>terrmaxramplimit then
   if xux.direction>0 then
    set xux.vecy=xux.vecy+TPCVecY*xux.terrperc*xux.terrhugeperc
   else
    set xux.vecy=xux.vecy+TPCVecY*xux.terrperc*xux.terrhugeperc*0.1
   endif
  else
   set xux.vecy=xux.vecy+TPCVecY*xux.terrperc
  endif
 endif
   set xux.vecx=xux.vecx*xux.terrfriction
   set xux.vecy=xux.vecy*xux.terrfriction
   set xux.vecz=xux.vecz*xux.terrfriction
 if RAbs(xux.vecx)<minspeedtoslow then
   set xux.vecx=0
 endif
 if RAbs(xux.vecy)<minspeedtoslow then
   set xux.vecy=0
 endif
 if RAbs(xux.vecz)<minspeedtoslow then
   set xux.vecz=0
 endif
 endif
if xux.hwminz!=0 then
  if xux.z+xux.Zmax>xux.hwminz then
     set xux.z=xux.hwminz-xux.Zmax
     set xux.vecz=-100
  endif
endif
if xux.z>MapMaxZ then
   set xux.z=MapMaxZ
   set xux.vecz=0
endif
 if MapMinUX>=xux.x or MapMaxUX<=xux.x or MapMinUY>=xux.y or MapMaxUY<=xux.y then
  if MapMinUX>=xux.x or MapMaxUX<=xux.x then
    set xux.x=GetUnitX(u)
    set xux.vecx=0
    set xux.veclastx=0
    set xux.veclast2x=0
   if MapMinUY>=xux.y or MapMaxUY<=xux.y then
    set xux.y=GetUnitY(u)
    set xux.vecy=0
    set xux.veclasty=0
    set xux.veclast2y=0
   endif
  else
    set xux.y=GetUnitY(u)
    set xux.vecy=0
    set xux.veclasty=0
    set xux.veclast2y=0
  endif
    call SetUnitX(u,xux.x)
    call SetUnitY(u,xux.y)
    call SetUnitZ(u,xux.z)
 else
   call SetUnitX(u,xux.x)
   call SetUnitY(u,xux.y)
   call SetUnitZ(u,xux.z)
 endif
 if xux.z<tmplocZ then
   set xux.z=tmplocZ
 endif
 if tmplocZ+xux.Zsize*rrx>=xux.z then
  if xux.direction>0 and xux.dead==false then
   call SetUnitFacing(u,xux.direction)
  endif
   call TCM_FallCheck(xux)
   set xux.vecz=-xux.mass
   set xux.z=tmplocZ
 endif
endif
endfunction


вод представь мне так удобно кодить =) даже очень + нравитьса.
Старый 16.09.2007, 17:33
adic3x

offline
Опыт: 108,439
Активность:
ну кста код вполне читаемый, по крайней мере для мну... правда это уже оффтоп началсо=)
Старый 16.09.2007, 23:15
J
expert
offline
Опыт: 48,447
Активность:
Toadcop ты как видно ничего не усвоил из нашего разговора в аське на эту тему... а я уж думал что все тебе растолковал=/ ну ладно... зачем дальше сторатся тебе чтото обьеснить?
хм.. ну код норм.. читаем..=)
P.S.
у тебя мания употреблять букву X в больших колиествах))
Старый 17.09.2007, 05:35
Ответ

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

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

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

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



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