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

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

Ответ
 
MaHBe

offline
Опыт: 5,910
Активность:
Оптимизация
Помогите пожалуйста оптимизировать данный код. Прошу только без вжасс и сжасс. Карта если что под патч 1.24
function Trig_Orders_IdPl takes nothing returns boolean
	return GetUnitAbilityLevel(GetTriggerUnit(), 'A999') == 1 and GetIssuedOrderId() == 851971
endfunction

function Trig_Orders_TakeOrder takes nothing returns nothing
	local unit Unit = GetOrderTargetUnit()
	local unit Unit1 = GetTriggerUnit()
	local item Item = GetOrderTargetItem()
	local integer id = GetPlayerId(GetOwningPlayer(Unit1))
	local real speed = GetUnitMoveSpeed(Unit1)
	local real x = GetUnitX(Unit1)
	local real y = GetUnitY(Unit1)
	local real x1 = GetOrderPointX()
	local real y1 = GetOrderPointY()
	local real x2 = GetItemX(Item)
	local real y2 = GetItemY(Item)
	local string order = null
	if GetIssuedOrderId() != 852511 then
		if x1 != 0 and y1 != 0 then
			call IssuePointOrder(Unit1,"move",x1,y1)
		elseif Item != null then
			call IssuePointOrder(Unit1,"move",x2,y2)
			call TriggerSleepAction(SquareRoot((x2-x)*(x2-x)+(y2-y)*(y2-y))/speed)
			set x = GetUnitX(Unit1)
			set y = GetUnitY(Unit1)
			if (x2-x)*(x2-x)+(y2-y)*(y2-y) < 250 then
				call UnitAddItem(Unit1,Item)
			endif
		elseif Unit != null then
			if IsPlayerEnemy(Player(id),GetOwningPlayer(Unit)) then
				set order = "attack"
			elseif Unit != Unit1 then
				set order = "move"
			endif
			call IssueTargetOrder(Unit1,order,Unit)
		endif
	endif
	set Item = null
	set order = null
	set Unit1 = null
	set Unit = null
endfunction

function InitTrig_Orders takes nothing returns nothing
	local integer i = 0
	set gg_trg_Orders = CreateTrigger(  )
	loop
		exitwhen i > 5
		call TriggerRegisterPlayerUnitEvent(gg_trg_Orders, Player(i),EVENT_PLAYER_UNIT_ISSUED_TARGET_ORDER, null)
		call TriggerRegisterPlayerUnitEvent(gg_trg_Orders, Player(i),EVENT_PLAYER_UNIT_ISSUED_POINT_ORDER, null)
		set i = i + 1
	endloop
	call TriggerAddCondition( gg_trg_Orders, Condition( function Trig_Orders_IdPl ) )
	call TriggerAddAction( gg_trg_Orders, function Trig_Orders_TakeOrder )
endfunction
P.S Я знаю что он ужасен.

Отредактировано Nekit1234007, 30.11.2010 в 20:22.
Старый 30.11.2010, 18:41
16GB
GhostOne User
offline
Опыт: 60,317
Активность:
кроме как вейта ничего плохого я не вижу тута
Старый 30.11.2010, 18:47
JassMan
свободен
offline
Опыт: 4,193
Активность:
Всё норм, за исключением большого кол-ва локалок.
Те которые используют не более 1 раза, лучше их удалить, а их значение писать сразу в то место где они используются.
И регистрацию событий написать лучше без цикла (подряд), ибо так быстрее считывается код.
Старый 30.11.2010, 19:51
MaHBe

offline
Опыт: 5,910
Активность:
JassMan:
не более 1 раза
Такие вроде отсутствуют
Старый 30.11.2010, 20:05
Sergarr

offline
Опыт: 4,677
Активность:
Не мешало бы отступы поставить в лупах и ифах.
Оптимизировать, вроде бы, нечего.
Старый 30.11.2010, 20:16
ScorpioT1000
Работаем
offline
Опыт: отключен
с отступами:
function Trig_Orders_IdPl takes nothing returns boolean
    return GetUnitAbilityLevel(GetTriggerUnit(), 'A999') == 1 and GetIssuedOrderId() == 851971
endfunction

function Trig_Orders_TakeOrder takes nothing returns nothing
    local unit Unit = GetOrderTargetUnit()
    local unit Unit1 = GetTriggerUnit()
    local item Item = GetOrderTargetItem()
    local integer id = GetPlayerId(GetOwningPlayer(Unit1))
    local real speed = GetUnitMoveSpeed(Unit1)
    local real x = GetUnitX(Unit1)
    local real y = GetUnitY(Unit1)
    local real x1 = GetOrderPointX()
    local real y1 = GetOrderPointY()
    local real x2 = GetItemX(Item)
    local real y2 = GetItemY(Item)
    local string order = null
    if GetIssuedOrderId() != 852511 then
        if x1 != 0 and y1 != 0 then
            call IssuePointOrder(Unit1,"move",x1,y1)
        elseif Item != null then
            call IssuePointOrder(Unit1,"move",x2,y2)
            call TriggerSleepAction(SquareRoot((x2-x)*(x2-x)+(y2-y)*(y2-y))/speed)
            set x = GetUnitX(Unit1)
            set y = GetUnitY(Unit1)
            if (x2-x)*(x2-x)+(y2-y)*(y2-y) < 250 then
                call UnitAddItem(Unit1,Item)
            endif
        elseif Unit != null then
            if IsPlayerEnemy(Player(id),GetOwningPlayer(Unit)) then
                set order = "attack"
            elseif Unit != Unit1 then
                set order = "move"
            endif
            call IssueTargetOrder(Unit1,order,Unit)
        endif
    endif
    set Item = null
    set order = null
    set Unit1 = null
    set Unit = null
endfunction

function InitTrig_Orders takes nothing returns nothing
    local integer i = 0
    set gg_trg_Orders = CreateTrigger(  )
    loop
        exitwhen i > 5
        call TriggerRegisterPlayerUnitEvent(gg_trg_Orders, Player(i),EVENT_PLAYER_UNIT_ISSUED_TARGET_ORDER, null)
        call TriggerRegisterPlayerUnitEvent(gg_trg_Orders, Player(i),EVENT_PLAYER_UNIT_ISSUED_POINT_ORDER, null)
        set i = i + 1
    endloop
    call TriggerAddCondition( gg_trg_Orders, Condition( function Trig_Orders_IdPl ) )
    call TriggerAddAction( gg_trg_Orders, function Trig_Orders_TakeOrder )
endfunction
(офк не вручную) :)
Старый 30.11.2010, 20:22
Nekit1234007

offline
Опыт: 11,916
Активность:
((код
local integer id = GetPlayerId(GetOwningPlayer(Unit1))
...
if IsPlayerEnemy(Player(id),GetOwningPlayer(Unit)) then
))
рукалицо.
Старый 30.11.2010, 20:22
MaHBe

offline
Опыт: 5,910
Активность:
Nekit1234007, АХАХА, точно) Раньше эта переменная еще для чего-то использовалась)
function Trig_Orders_IdPl takes nothing returns boolean
    return GetUnitAbilityLevel(GetTriggerUnit(), 'A999') == 1 and GetIssuedOrderId() == 851971
endfunction

function Trig_Orders_TakeOrder takes nothing returns nothing
    local unit Unit = GetOrderTargetUnit()
    local unit Unit1 = GetTriggerUnit()
    local item Item = GetOrderTargetItem()
    local real speed = GetUnitMoveSpeed(Unit1)
    local real x = GetUnitX(Unit1)
    local real y = GetUnitY(Unit1)
    local real x1 = GetOrderPointX()
    local real y1 = GetOrderPointY()
    local real x2 = GetItemX(Item)
    local real y2 = GetItemY(Item)
    local string order = null
    if GetIssuedOrderId() != 852511 then
        if x1 != 0 and y1 != 0 then
            call IssuePointOrder(Unit1,"move",x1,y1)
        elseif Item != null then
            call IssuePointOrder(Unit1,"move",x2,y2)
            call TriggerSleepAction(SquareRoot((x2-x)*(x2-x)+(y2-y)*(y2-y))/speed)
            set x = GetUnitX(Unit1)
            set y = GetUnitY(Unit1)
            if (x2-x)*(x2-x)+(y2-y)*(y2-y) < 250 then
                call UnitAddItem(Unit1,Item)
            endif
        elseif Unit != null then
            if IsPlayerEnemy(GetOwningPlayer(Unit1),GetOwningPlayer(Unit)) then
                set order = "attack"
            elseif Unit != Unit1 then
                set order = "move"
            endif
            call IssueTargetOrder(Unit1,order,Unit)
        endif
    endif
    set Item = null
    set order = null
    set Unit1 = null
    set Unit = null
endfunction

function InitTrig_Orders takes nothing returns nothing
    local integer i = 0
    set gg_trg_Orders = CreateTrigger(  )
    loop
        exitwhen i > 5
        call TriggerRegisterPlayerUnitEvent(gg_trg_Orders, Player(i),EVENT_PLAYER_UNIT_ISSUED_TARGET_ORDER, null)
        call TriggerRegisterPlayerUnitEvent(gg_trg_Orders, Player(i),EVENT_PLAYER_UNIT_ISSUED_POINT_ORDER, null)
        set i = i + 1
    endloop
    call TriggerAddCondition( gg_trg_Orders, Condition( function Trig_Orders_IdPl ) )
    call TriggerAddAction( gg_trg_Orders, function Trig_Orders_TakeOrder )
endfunction
Старый 30.11.2010, 20:26
JassMan
свободен
offline
Опыт: 4,193
Активность:
Я про цикл ещё что-то говорил
Старый 30.11.2010, 20:30
ScorpioT1000
Работаем
offline
Опыт: отключен
TriggerSleepAction(SquareRoot((x2-x)*(x2-x)+(y2-y)*(y2-y))/speed
бида в том, что он может оббегать, т.е. двигаться не только по прямой -.- но в принципе я так всё и делал обычно
Старый 30.11.2010, 20:31
MaHBe

offline
Опыт: 5,910
Активность:
JassMan, Я все потом буду собирать в один триггер инициализации, поэтому не буду трогать. Все ф-ции перенесу в кустом код.
MaHBe добавил:
ScorpioT1000, Вроде работает более-менее стабильно
Старый 30.11.2010, 20:32
Klop
Папа римский
offline
Опыт: 13,006
Активность:
function InitTrig_Orders takes nothing returns nothing
    local integer i = 0
    local trigger t = CreateTrigger(  )
    loop
        exitwhen i > 5
        call TriggerRegisterPlayerUnitEvent(gg_trg_Orders, Player(i),EVENT_PLAYER_UNIT_ISSUED_TARGET_ORDER, null)
        call TriggerRegisterPlayerUnitEvent(gg_trg_Orders, Player(i),EVENT_PLAYER_UNIT_ISSUED_POINT_ORDER, null)
        set i = i + 1
    endloop
    call TriggerAddCondition( gg_trg_Orders, Condition( function Trig_Orders_IdPl ) )
    call TriggerAddAction( gg_trg_Orders, function Trig_Orders_TakeOrder )
    set t = null
endfunction
или без разницы?,я саме тупе,сор если тупой оффтоп
Старый 30.11.2010, 21:49
Ответ

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

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

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

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



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