20

» WarCraft 3 / Очень бомбит от непонимания дропа предметов

Ну, тебе этот вариант скорее всего не понравится, но я всё-равно предложу.
globals
	itempool ItemPool = null
endglobals

function GenerateItemPool takes nothing returns nothing
	if ItemPool == null then
		set ItemPool = CreateItemPool( )
		call ItemPoolAddItemType( itemPool, 'shas', 1. )
		// И так далее...
	endif
endfunction
Подробное пояснение "веса" предметов тут: www.hiveworkshop.com/threads/itempools-guide.35180
Конечно придётся все предметы ЕДИНОЖДЫ забить, а потом при триггерном срабатывании смерти виджета (проверить что это был предмет/коробка и т.д.) вызвать PlaceRandomItem( ItemPool,x,y ), с WE не знаю, что тебе там палки в колёса вставляет. :(
20

» WarCraft 3 / Деление голды как в доте 1

Motan021 жди гуишников тогда, я таким не промышляю.
20

» WarCraft 3 / Деление голды как в доте 1

Дам ему прямой ответ, правда я лишь с третьего раза понял что он хотел.
Так как индексы 0 (1 в ГУИ - красный) и 6 (7 в ГУИ - зелёный) у нас компьютеры, с ними делиться не нужно, занчит кол-во игроков у нас не 12, а 10. получается так:
integer goldPerPlayer = R2I( 4265 / ( 12 - 2 ) )
Однако, если это делать по-человечески, то будет так:
function CountTeamPlayersEx takes integer team, playerslotstate slotstate, mapcontrol controlstate returns integer
    local integer i = 0
    local integer count = 0
    local player p = null
    local boolean isSlotOk = true
    local boolean isControlOk = true

    loop
        set p = Player( i )
        set isSlotOk = slotstate == null or GetPlayerSlotState( p ) == slotstate
        set isControlOk = controlstate == null or GetPlayerController( p ) == controlstate

        if isSlotOk and isControlOk and GetPlayerTeam( p ) == team then
            set count = count + 1
        endif

        set i = i + 1
        exitwhen i == bj_MAX_PLAYERS
    endloop

    set p = null // фактически не нужна, ибо Player( i ) не вызывает утечку.
    return count
endfunction

function CountRealTeamPlayers takes integer team returns integer
    return CountTeamPlayersEx( team, PLAYER_SLOT_STATE_PLAYING, MAP_CONTROL_USER )
endfunction

function GiveGoldToTeam takes integer team, integer gold returns nothing
    local integer i = 0

    loop
        set p = Player( i )
        if GetPlayerSlotState( p ) == PLAYER_SLOT_STATE_PLAYING and GetPlayerController( p ) == MAP_CONTROL_USER and GetPlayerTeam( p ) == team then
            call SetPlayerState( p, PLAYER_STATE_RESOURCE_GOLD, GetPlayerState( p, PLAYER_STATE_RESOURCE_GOLD ) + gold )
        endif

        set i = i + 1
        exitwhen i == bj_MAX_PLAYERS
    endloop
endfunction

function GiveGoldToPlayers takes integer gold returns nothing
	local integer team1Players = CountRealTeamPlayers( 0 )
	local integer team2Players = CountRealTeamPlayers( 1 )
    local integer playerCount  = team1Players + team2Players
	local integer goldPerTeam  = R2I( gold * .5 )
	
    call GiveGoldToTeam( 0, R2I( goldPerTeam / team1Players ) )
    call GiveGoldToTeam( 1, R2I( goldPerTeam / team2Players ) )
endfunction
Вроде как не допустил ошибок, если будет где-то ошибка, сообщи.
20

» WarCraft 3 / Помогите найти ошибку

Unryze, И как приблизительно это понимать ?
Ошибка связана с каким-то из юнитов, имеющий невозможные координаты (вылетел за карту), если дать приказ находясь за пределами карты (не только за игровыми, а в целом), то будет краш. Других отсылок я не нашёл.
20

» WarCraft 3 / Помогите найти ошибку

Загрузи файл с ошибкой, он в папке Errors в корневой папке Warcraft III, вот тут:
Нужен файлик Crash.txt:
Загруженные файлы
20

» WarCraft 3 / Удаление не разрушаемых объектов ( трава камни)

Погляжу в псевдокоде game.dll как оно их обрабатывает, может и осилю добавить функционала Doodad'ам в кастом патче, что я делаю ну и может даже в мемхак добавлю.
С мемхаком в карту даже на иринаботе нельзя будет поиграть. Это получится варик только для себя, в который не с кем поиграть!
Что за басни? Всё прекрасно работает, тот же Naruto Legend на ирине с МемХаком, он же как-то работает? Брррр.
16GB:
Я скрывал декорации так , но это конечно не удаление
call SetDoodadAnimationRect(gg_rct_NBTPT,'D00C',"hide",false)
Работало вроде и без специальной модели
Удаление ничего не сделает, я уже глянул внутрь игры, проходимость ставится через карту путей, а сама декорация - тупо моделька, то есть надо найти ещё и её карту путей, чтобы полноценно удалить, в самой игре даже функции такой нет, ибо явно не рассчитывалось на это.
20

» WarCraft 3 / за 300р найти 3 файла в листфайле

Если не находит, значит его там нет.
файл есть, но с неизвестным именем
это имя надо найти, естественно этого имени нет в листфайле, для этого и ищется
Наверное стоит заранее написать, что вообще искать надо?
нужно найти реальное имя трёх файлов
File00000652.blp
File00000653.blp
File00000654.blp
все остальные имена найдены
Имена blp если не ищутся, значит оно и не используется. Значит имя восстановить невозможно (по крайней мере без шаманизма с MPQ и парсингом имени файла, но такое вроде как не делается, ибо даже создатель MPQ Editor не знает как это сделать). Говоря проще, можешь смело эти 3 файла удалять, если где-то всплывёт недостающая текстура/иконка, тогда и можно будет отловить, что же пропало.
20

» WarCraft 3 / за 300р найти 3 файла в листфайле

Наверное стоит заранее написать, что вообще искать надо? А то если ты не знаешь есть ли в карте эти файлы или нет, то ответ выше - верный. Если у тебя есть скриншот модели из игры, которую нужно найти, то это значительно упрощает вещи.
Информация - важная штука.
20

» WarCraft 3 / Удаление не разрушаемых объектов ( трава камни)

Ну, Doodad (который не разрушаемый) не имеет API и на рефорже, в игре код на их удаление есть, но вот "добраться" до них - опять же нечем. Да и создавать их в рантайме тоже нечем, говоря проще они рассчитывались на то, что втыкаются 1 раз и не трогаются.
Краткий ответ: нет.
Полный ответ: делать велосипед и использовать либо разрушаемый объект, либо как ты уже и сказал юнита.
Конечно есть:
native SetDoodadAnimation takes real x, real y, real radius, integer doodadID, boolean nearestOnly, string animName, boolean animRandom returns nothing
native SetDoodadAnimationRect takes rect r, integer doodadID, string animName, boolean animRandom returns nothing
Погляжу в псевдокоде game.dll как оно их обрабатывает, может и осилю добавить функционала Doodad'ам в кастом патче, что я делаю ну и может даже в мемхак добавлю.
20

» Warcraft III - Lua / Warcraft III - Lua

Портируется ли на рефордж или же придется переделывать код?
Если речь о нативках, они будут реализованы как "врапперы" и скорее всего пойдут в Blizzard.j, но работать будут так же, ибо я не горю желанием обзывать функции Blz, но их поддержку можно сделать банальным вызовом соответствующей нативки. Просто немного бы подробнее бы расписал, что именно нужно "портировать".
Согласен, непонятно выразился.
Если допустим я сейчас буду в 1.26 писать на Lua, захочу вот перенести карту в рефордж, смогу ли я уже её редактировать в рефордже с новыми функциями рефорджа(ведь были добавлены новые функции), откроется ли она у меня, а то я так полагаю тут и мемхак частично задействован в этой сборке исходя из видео, а в рефордже его убрали насколь знаю
В идеале (по-крайней мере я попытаюсь так сделать), что можно будет прямо весь ЛУА код с рефорджа перетащить на 1.26а и наоборот, я хочу добавить поддержку всех нативок. Однако, ввиду того, что я добавлю БОЛЬШЕ чем на рефордже, то перейти с нашего патча (используя новые функции) на рефордж будет уже нельзя. То есть будет +- полная ОБРАТНАЯ совместимость, но вот совместимость "вперёд" будет в руках близзардов. :D
20

» Warcraft III - Lua / Warcraft III - Lua

Портируется ли на рефордж или же придется переделывать код?
Если речь о нативках, они будут реализованы как "врапперы" и скорее всего пойдут в Blizzard.j, но работать будут так же, ибо я не горю желанием обзывать функции Blz, но их поддержку можно сделать банальным вызовом соответствующей нативки. Просто немного бы подробнее бы расписал, что именно нужно "портировать".
20

» WarCraft 3 / Что предпочтительней и почему Lua или Jass?

Первая карта (benchmark.w3m) содержит исходники скрипта.
Вторая карта (benchmark-packed.w3m) уже укомплектована DLL с нативками и готова к запуску.
Решил у себя проверить, вот разница от local integer p и local integer dddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddd
Разница в 24нс на 1 итерацию.
Дальше по поводу вызова функций, ForForce добавляет свою задержку, но хз по идее она не должна сильно повлиять, а по поводу сортировки, тут уже отсутствие оптимизации компилятора/интерпретатора, который есть даже на паскале, по этим нюансам офк джасс уступает, но я говорил непосредственно про нативки и про +- дефолтную "конвенцию" и работу со скриптами от большинства картоделов, кому эта разница не увидится нигде.
Но если уже судить по всем пунктам и сразу, то конечно же LUA будет лучше по всем параметрам в плане производительности и скорости, но у Джасса своя ниша, и куда более простой "путь" входа, что фактически является его самым большим и возможно единственным плюсом.
Это все очень хорошо, но так и не дали главный ответ - что лучше луа или джасс? Чтобы можно было закрыть этот тред
Ответ был уже дан - LUA профитнее по большим пунктам, если есть хоть чуть-чуть знания/азы программирования. Если же нет, то Джасс будет проще и быстрее освоить, да и в плане Вар 3 - я считаю что он всё-равно удобнее.
Загруженные файлы
20

» WarCraft 3 / Что предпочтительней и почему Lua или Jass?

Unryze
Длина переменной не влияет на скорость никак - это очередной тупой миф
Написал для теста код, что упорядочивает массив используя сортировку пузырьком.
функция сортировки
function s__NormalArray_sort takes nothing returns nothing
local boolean swapped
local integer temp
local integer i

	loop
		set swapped = false
		set i = 0

		loop
			exitwhen not (i < JASS_MAX_ARRAY_SIZE-1)

			if items[i] > items[i+1] then
				set temp = items[i]
				set items[i] = items[i+1]
				set items[i+1] = temp
				set swapped = true
			endif

			set i = i + 1
		endloop

		exitwhen not swapped
	endloop
	
endfunction

Результаты теста

Имена переменных Затраченное время
Без изменений 90704 мс (1 минута 30 секунд)
Длина 1 символ 84484 мс (1 минута 24 секунд)
Длина 85 символов 387219 мс (6 минут 27 секунд)
Длина 340 символов 1235703 мс (20 минут 35 секунд)

Исходники JASS скрипта

Caller
library Caller initializer init {

     #include "cj_types_priv.j"

    private force dummy_force

    void CallFunction(code f) {
        ForForce(dummy_force, f)
    }

    private void init() {
        dummy_force = CreateForce()
        ForceAddPlayer(dummy_force, Player(0))
    }

}
Benchmark
native GetTickCount takes nothing returns integer
native SetOperationLimitEnabled takes boolean state returns nothing
native IsOperationLimitEnabled takes nothing returns boolean

library benchmark initializer init uses Caller {

    #include "cj_types_priv.j"

    define ITEMS_COUNT = JASS_MAX_ARRAY_SIZE
    
    define MAKE_SORTABLE_ARRAY(TYPE_NAME, items, swapped, temp, i) = {
        integer items[]
    
        struct TYPE_NAME {
        
            static void fill() {
                for (int i = 0; i < ITEMS_COUNT; i++) {
                    items[i] = ITEMS_COUNT - 1 - i
                }
            }
            
            static void sort() {
                bool swapped
                int temp
                int i;
                
                loop {
                    swapped = false
                    
                    for (i = 0; i < ITEMS_COUNT-1; i++) {
                        if items[i] > items[i+1] {
                            temp = items[i]
                            items[i] = items[i+1]
                            items[i+1] = temp
                            swapped = true
                        }
                    }
                    
                    exitwhen not swapped
                }
                
                BJDebugMsg("Sorting finished.")
            }
            
            static bool check() {
                for (int i = 0; i < ITEMS_COUNT-1; i++) {
                    if items[i] > items[i+1] {
                        return false
                    }
                }
                
                for (int i = 0; i < ITEMS_COUNT; i++) {
                    if items[i] != i {
                        return false
                    }
                }
                
                return true
            }
            
            static void benchmark() {
                fill()
                
                int start_time = GetTickCount()
                
                CallFunction(function thistype.sort)
                
                int end_time = GetTickCount()
                int difference = end_time - start_time
                
                if !check() {
                    BJDebugMsg("Sorting failed.")
                }
                else {
                    BJDebugMsg("Time elapsed: " + I2S(difference) + " ms.")
                }
            }
        }
    }
    
    MAKE_SORTABLE_ARRAY(FastArray, a, b, c, d)
    MAKE_SORTABLE_ARRAY(NormalArray, items, swapped, temp, i)
    MAKE_SORTABLE_ARRAY(SlowArray,aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa,bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb,ccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc,ddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddd)
    MAKE_SORTABLE_ARRAY(VerySlowArray,aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa,bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb,cccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc,dddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddd)
    
    void start() {
        bool old_state = IsOperationLimitEnabled()
        SetOperationLimitEnabled(false)
        
        CallFunction(function FastArray.benchmark)
        CallFunction(function NormalArray.benchmark)
        CallFunction(function SlowArray.benchmark)
        CallFunction(function VerySlowArray.benchmark)
        
        SetOperationLimitEnabled(old_state)
    }
    
    void init() {
        trigger t = CreateTrigger()
        TriggerAddAction(t, function start)
        TriggerRegisterPlayerChatEvent(t, Player(0), "-start", true)
    }

}

Другие языки

На Pascal'е сортировка заняла 85 мс, что почти в тысячу раз быстрее.
А при использовании статических массивов время снизилось до 72 мс.
Тот же результат выдала и моя asm реализация независимо от типа массива.
pascal
unit Unit1;

{$mode objfpc}{$H+}

interface

uses
	Windows,
	Classes, SysUtils, Forms, Controls, Graphics, Dialogs, StdCtrls;

type

	{ TForm1 }

	TForm1 = class(TForm)
		StartButton: TButton;
		Log: TMemo;
		procedure StartButtonClick(Sender: TObject);
	private

	public

	end;

    //{$define STATIC_ARRAY}

const
	TEST_ARRAY_SIZE = 8192;

type
	TIntegerArray = array {$ifdef STATIC_ARRAY}[0..TEST_ARRAY_SIZE-1]{$endif} of Integer;
	TSortFunction = procedure (var Items: TIntegerArray);

var
	Form1: TForm1;

implementation

{$R *.lfm}

procedure FillArray({$ifdef STATIC_ARRAY}out{$endif} Items: TIntegerArray);
var
	i: Integer;
begin
	for i:= 0 to High(Items) do begin
		Items[i]:= High(Items) - i;
	end;
end;

procedure BubbleSort({$ifdef STATIC_ARRAY}var{$endif} Items: TIntegerArray);
var
	i: Integer;
	Temp: Integer;
	Swapped: Boolean;
begin
	repeat
		Swapped:= False;

		for i:= 0 to High(Items) - 1 do begin
			if Items[i] > Items[i+1] then begin
				Temp:= Items[i];
				Items[i]:= Items[i+1];
				Items[i+1]:= Temp;

				Swapped:= True;
			end;
		end;

	until not Swapped;
end;

procedure BubbleSortASM(Items: PInteger; Count: Integer); cdecl;
begin
	asm
		pushad

		mov edx, Items
		mov ebx, Count
		dec ebx

		@repeat:
			mov eax, False

			xor ecx, ecx
			@loop:
				lea ebp, [edx+ecx*4]
				mov esi, [ebp]
				mov edi, [ebp+4]

				cmp esi, edi
				jle @skip
					mov [ebp], edi
					mov [ebp+4], esi
					mov eax, True

				@skip:

				inc ecx
				cmp ecx, ebx
				jl @loop

			test eax, eax
			jnz @repeat

		popad
	end;
end;

function IsArraySorted({$ifdef STATIC_ARRAY}const{$endif} Items: TIntegerArray): Boolean;
var
	i: Integer;
begin
	Result:= True;

	for i:= 0 to High(Items) - 1 do begin
		if Items[i] > Items[i+1] then
			Result:= False;
	end;

	for i:= 0 to High(Items) do begin
		if Items[i] <> i then
			Result:= False;
	end;
end;

procedure StartTest(TestFunction: TSortFunction);
var
	Items: TIntegerArray = nil;
	Frequency: Qword;
	StartTime, EndTime, ElapsedTime: Qword;
begin
	QueryPerformanceFrequency(@Frequency);

	{$ifndef STATIC_ARRAY}SetLength(Items, TEST_ARRAY_SIZE);{$endif}
	FillArray(Items);

	QueryPerformanceCounter(@StartTime);
	TestFunction(Items);
	QueryPerformanceCounter(@EndTime);

	ElapsedTime:= EndTime - StartTime;

	if IsArraySorted(Items) then
		Form1.Log.Lines.Add('Time elapsed: %d ms.', [ElapsedTime div (Frequency div 1000)])
	else
		Form1.Log.Lines.Add('Sorting failed.');
end;

procedure BubbleSortBenchmark(var Items: TIntegerArray);
begin
	BubbleSort(Items);
end;

procedure BubbleSortASMBenchmark(var Items: TIntegerArray);
begin
	BubbleSortASM(@Items[0], Length(Items));
end;

{ TForm1 }

procedure TForm1.StartButtonClick(Sender: TObject);
begin
	StartTest(@BubbleSortBenchmark);
	StartTest(@BubbleSortASMBenchmark);
end;

end.
Про длину я затупил и сам же это и доказал своими тестами, но и тебе спасибо за твой тест. Скинь пожаолуйста карту, чтобы можно было глянуть что cJass в итоге превратит в обычный джасс, хочу посмотреть и замерить тоже, но я выше показал причину дополнения задержки, с переменными похоже та же басня, что странно:
Всё-таки очень странно, что сортировка на столько дикую разницу имеет, имею сомнения как не крути.
Загруженные файлы
20

» WarCraft 3 / Что предпочтительней и почему Lua или Jass?

Много интересных постов в теме, но ответа на главный вопрос так и не было. Lua или Jass?
В ситуации если доступны оба, но если с программированием ОЧЕНЬ слабо знаком - джасс будет проще для начала, но LUA был и будет перспективнее, ибо не только сможешь пилить карты в варкрафте, но и в будущем скрипты под свои нужды как для других программ, так и в целом выучишь хотя бы полезный ЯП. О чём неоднократно тут уже писали. :D
20

» WarCraft 3 / Что предпочтительней и почему Lua или Jass?

Unryze, какие наносекунды, ты же вроде офигеть какие там тулзы пишешь, ну мог бы сделать бенчмарк хотябы - там только на создание сопрограммы и нового стека и потом их убития уйма времени выделяется, что в лупе аж рендер фризился
про execute
ещё
ещё
Про длину названия это ещё из 2006 xgm.guru/forum/showpost.php?p=190747&postcount=5
И потом вроде были бенчмарки, найти уже не знаю по каким кейвордам
Про глобалки вс локалки и массивы вс примитивы
ещё
ещё
Эти люди - не рандомы, писали тулзы и ловили вызовы через дебаггеры, тоже делали инъекции в исполняемый код. wc3c сдох и в веб архиве найти ничего не смог.
Естественно, ещё много лично с ними общался, щас таких мессенджеров уже нет
Есть контраргументы?
Мой тред про мифа Джасса - это и есть контраргумент, а по поводу функций, они в байткоде выходят в id, я не знаю что они там тестировали - кроме как пустой воздух, я же кидал байткод в моём треде для чего? Для красоты? Все функции переводятся в индексы и вызываются по НИМ, потому ДЛИНА их НАЗВАНИЯ не влияет ровно ни на что, ибо оно "компилится" в байткод ЕДИНОЖДЫ.
Я позже разберу все данные тобою ссылки, видать нужно тотально все эти бредни опровергнуть, а то не угомонитесь. :)

Начнём пожалуй очередной разбор мифов:
xgm.guru/forum/showpost.php?p=422071 (ExecuteFunc - создание потока ресурсоёмкое и прочая бурда).
От части правда, но фишка в том, что ForGroup и ForForce создают потоки тоже, и хоть они и медленнее, разница не прямо занебесная. Но так как речь об ExecuteFunc, разберём его подробнее.
Кратко о коде, название функции кешируется и закидывается в "std::map" (косвенно, ибо в С нет этого понятия, но логика та же), что же делается? Функция обрабатывается как "нативка", в том плане, что индексируется и последующие вызовы идут уже СТРОГО по индексу, делается итерация и по StringHash (внутри игры эта функция работает значительно быстрее джасс обработчика) делается проверка та ли функция. Посмотрим же на задержку:
2 мс - это итерация 10к цикла (но для удобства подсчёта оставим всё как есть), и того 53мс на 10000 вызовов, что равно 53 / 10000 = 0.0053мс или же 5300 наносекунд, для любителей секунд - 5.3e-6 секунд.
Проверим теперь обычный call и посмотрим его байткод:
Фактическая задержка тут вообще 1мс, что конечно же в разы быстрее (а точнее в 50 раз, что в целом и ожидалось), а теперь давайте же увеличим имя функции до максимума и посмотрим уже после этого на байткод:
И так, добавилось 2 мс задержки (что не смертельно), но почему же? Смотрим сюда:
В байткоде идёт 16 - call jass, а индекс 4689, то бишь JASM вызывает по индексу, но почему же добавилась задержка? Да вот дело в банальном обработчке вызовов:
Игра ещё и имя выхватывает и делает стрингхеш (чтобы убедиться, что функция есть и вызов её не повлечёт фиаско).
Но фактически эта разница не колоссальная, ибо SomeFunction - длина 12, а SomeFunctionSomeFunctionSomeFunctionSomeFunctionSomeFunctionSomeFunctionSomeFunctionSomeFunctionSomeFunctionSomeFunction - 120, что изменило результат на жалкие 2 мс, которые вы никак и никаким боком не почувствуете.
По поводу TriggerEvaluate vs TriggerExecute - фактически та же песня:
Рассмотрим причину:
А теперь TriggerEvaluate:
В то время как TriggerExecution так же вызывает нет траффик, чтобы убедиться в валидности и вызывает ивент, TriggerEvaluate не делает ничего схожего, потому конечно он быстрее, но если разница в скорости важнее, чем валидность данных, ну даже не знаю. И да TriggerExecute в начале вызывает TriggerEvaluate и лишь потом завершает свой блок, то бишь она жирнее по своему построению, вопрос только в том к чему этот пример ScorpioT1000.
Видать нужно пояснить "Скорп, разница между этими языками по скорости хоть и значительна, но на фактически даже не на уровне НАНОсекунд, а практически на уровне ПИКОсекунд." подробнее, речь о прямом сравнении обработки JASM машины и то, как делаются вызовы, ExecuteFunc - фактически не имеет аналога на ЛУА, потому сравнение банально неправильное (хотя там ExecuteFunc и не нужен, но в пример привёл ты это, хотя я говорил вообще о других вещах).
xgm.guru/forum/showpost.php?p=425373 -> пояснил выше, опять же не понимаю к чему ты это вкинул ибо эта же задержка будет и на ЛУА, иди и проверь?
xgm.guru/forum/showthread.php?t=18742 -> это вообще уровень бреда, убираются лишний код, что конечно же ускорит работу, мне немного аж стыдно, что ты это в пример привёл.
Jass Mythubusters:
Установка literal (которая занимает пикосекунду?) и setvar (который глобалкой ты хотя бы раз делаешь), но да, эта фантомная разница и выдуманные 6 операций (без каких-либо пруфов) - это конечно же аргумент.
И того, что мы имеем, большинство информации банально неверная, а которая и верная - будет иметь тот же результат и на LUA (если вызвать ExecuteFunc или же TriggerExecute на LUA то бишь, будет такая же задержка, ибо это задержка ВНУТРИИГРОВАЯ - задержка движка).
20

» WarCraft 3 / Что предпочтительней и почему Lua или Jass?

Lua интерпретируется либой, написанной на си - lualib, довольно быстро, я там на тысячах векторах 60 фпс неплохо исполнял и применял к юнитам.
Жасс - древнее говно, где скорость даже зависит от длины имени переменной, медленное обращение к глобалкам, про execute func, хештейблы и прочие костыли вообще молчу.
Короче, нет желания в сотый раз всё это пережевывать, читаем статьи, вики, набираемся опыта.
Длина переменной не влияет на скорость никак - это очередной тупой миф, который я даже не знаю откуда пошёл, но вроде как от драколича (он тоже часто ошибается). Медленное обращение к глобалкам? Для тебя 1 нс - это много? ._. ExecuteFunc срабатывает за 4 нс (2 нс вызов, 2 нс хеширование строки и запись Id, последующие вызовы 2 нс), хештейбл по скорости без стриншехей 2 нс, или же 4 нс с большими цифрами.
Скорп, разница между этими языками по скорости хоть и значительна, но на фактически даже не на уровне НАНОсекунд, а практически на уровне ПИКОсекунд. В общем говоря, Джасс на удивление не такой уж и медлительный, как его считали, но в любом случае ЛУА быстрее - это факт, но разница не такая колоссальная, чтобы обливать джасс прямо тонной.
20

» WarCraft 3 / Что предпочтительней и почему Lua или Jass?

Главное, что стоит знать: Jass по производительности не уступает С++.
JackFastGame, причем тут скорость исполнения функции из api варкрафта и производительность самого языка. Для примера можете посмотреть как тестируются языки тут habr.com/ru/post/532432
С++ был и будет всегда быстрее чем джасс и тот же ЛУА, да и он +- в 100 раз быстрее ЛУА (который считается самым быстрым интерпретируемым языком). Но в Варкрафте в целом от этих разницы будет не большая разница, но как и сказал konvan5, если был опыт с ЛУА, то используй его, тем более если планируешь работать на рефорджеде (по-мимо проекта от Ev3nt и китайского YDWE с ЛУА варианто поработать на ЛУА вне рефорджеда и нет). Но вот по фреймам - неправда, ибо нативки и там и там есть и делать можно всё так же.
По вызову нативок, разница была в наносекунды, то бишь JASM байткод в целом обрабатывается на достаточно приемлемой скорости, но лимит Jass обработчика - это циклы, которые имеют лимит (который я не знаю где снимать) и при превышении его нормы игра просто на просто отказывается это "обрабатывать" и уходить в застой. :D
Всё в общем склоняется к твоим навыкам и восприятию ЯП, если же (без обид) тебе с трудом даются ЯП, то Jass будет тебе проще.
20

» WarCraft 3 / Съехала панель

Древний и могучий баг в World Editor, решается довольно просто:
Потяни эту полоску вниз:
И всё.
Загруженные файлы
20

» WarCraft 3 / WinMPQ v1.64

Просто закиньте этот файл в папку с программой и всё.
Загруженные файлы
20

» WarCraft 3 / WFE - Warcraft Feature Extender

WFE 3.0.1.4
Changelog:
  1. Fixed UI priority for UpperMenuBar, ResourceBar and Minimap buttons that would have lower priority than the Console at random.
  2. Fixed Cooldown Indicator width in Upgrgraded UI mode not covering the whole button.
  3. Fixed Fatal Error with Multiwindow mode on Warcraft 3, due to malformation of memory by the said feature, added a more robust memory address check to prevent the issue.
  4. Fixed HP/MP labels not being hidden when UI was hidden via ShowInterface or CinematicPanel.
  5. Fixed HP/MP keeping previous values on units that have no HP at all, or have INVULNERABLE state flag, now it will be empty as it should have been.
  6. Fixed CBuffBar and subsequent CBuffs duration from being drawn on units that are not owners of the buff.
    Note: it was breaking due to units not having CBuffBar at all, meaning "Status:" text was hidden along with all frames, etc.
  7. Added Korean translation, thanks to: 까끼꾸 (Discord).
  8. Fixed issue with RMC auto-activating, while any WFE bind for abilities/items/spellbook were held down.
  9. FIxed a bug where LCtrl + G bind would result in the same value as LAlt + 3.
    Note: this was caused by my "obsession" with limiting the occupied bytes, so I was not "multiplying" the modifier value by a high enough number to avoid collisions, so I raised it from 10 to 0x100 (256).
  10. Fixed IgnoreFreeLibrary issue yet again, it was appearing due to the UI Hook that was failing to detach itself, as compared to all other hooks.
  11. Changed default font used from "Fonts\\FRIZQT__.TTF" to MasterFont (aka whichever is being considered as main font by the game build).
    Note: if you wish to override the MasterFont for WFE, use this path: WFEFonts\\Master.ttf.
    Note 2: if you wish to override any font of the game, then simply do the same, but use the paths that the game uses, i.e. Fonts\\FRIZQT__.TTF.
  12. Reworked smartcast feature and removed additional safe check (this was causing some abilities "the auto-castable abilities mostly" to not interact perfectly).
    Note: it was causing the "target circle" to blink, but it would still work overall.
  13. Fixed a bug with Ability/Item keybinds that would use default hotkey if no ability/item was successfully pressed or it cannot be pressed.
20

» Quro / Quro

Итак, что мы имеем:
Гильдия "Черамор"
X-Forge
Quro
Порядок "Волчья Повесть"
Деятельность остальных сообществ я замечал. Однако это творческое объединение (Quro) окутано мраком. Я замечал какие-то собрания в войсе дискорда. Относятся ли они к этому объединению?
Технически - да, ибо фактически Vlod, Ev3nt уж точно часть этого сообщества, а я с ними делаю общий проект, просто ввиду моей занятости из-за универа, работы и т.д. прогресс немного медленный (но тестовый продукт уже есть). Нужно ещё немного потерпеть и скоро будет выкачены вкусняшки, от Ev3nt ЛУА (который вроде уже до конца доработан + возможность IO, которую вырезали в рефе, офк она урезанная и него, чтобы нельзя было выйти за папку Вар 3). От меня уже сделано 400 нативок (ещё делать тучу) ну и добавить поддержку патчей 1.24е/1.27a/1.27b/1.28f в LUA Ev3nt. Затем сделать лаунчер, который будет иметь автообновление, подгрузчик MPQ и прочие шалости. В общем работы много, она идёт и как будет +- то, что хотя бы можно показать без шаолинских фокусов - покажем.
20

» WarCraft 3 / BlzSetUnit[something]Field Всё-таки работает или нет?

Если же близзарды сделали это так, как я реализовал в мемхаке (то бишь меняются дефолтные данные), то чтобы изменения вступили в силу нужно пересоздать юнита. То бишь эти изменения не на выбранного юнита, а на всех юнитов с этим typeid (в твоей ситуации это все последующие Hblm и hpea).
20

» WarCraft 3 / Dark style for TESH

Для тех кому лень обновлять теш (у меня он отказался работать с JNPG 1.4), даю мой файлик стилей для старого Теша:
Надо ставить 0.9.3, как у Влода на скрине. Самый последний не пашет с JNGP.
У меня 0.9.3 тоже не запускался, у меня скорее всего ещё более древний JNPG, но мне и с ним норм. :D Но спасибо за пояснение.
20

» WarCraft 3 / Dark style for TESH

Для тех кому лень обновлять теш (у меня он отказался работать с JNPG 1.4), даю мой файлик стилей для старого Теша:
Для смены цвета общего текста и текста линий также нужно заменить TESH.ini:
И получается что-то в таком виде:
Заранее советую сделать бекап дефолт стиля, то бишь сделать копию Styles.ini, чтобы если вам надоел мой стиль, можно было легко откатиться назад.
Загруженные файлы
20

» Warcraft III - Lua / Warcraft III - Lua

Unryze, буду рад с вами работать. Blz wrapper уже реализован, однако у меня есть ещё идеи по его усовершенствованию. Если хотите, могу отписать вам, но чуть позже, так как испытыванию небольшие трудности с компьютером.
Буду тоже рад, не надо на "Вы", слишком уж уважительно. :D Связаться думаю будет проще по дискорду.