Ну, тебе этот вариант скорее всего не понравится, но я всё-равно предложу.
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 не знаю, что тебе там палки в колёса вставляет. :(
Дам ему прямой ответ, правда я лишь с третьего раза понял что он хотел.
Так как индексы 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
Вроде как не допустил ошибок, если будет где-то ошибка, сообщи.
Ошибка связана с каким-то из юнитов, имеющий невозможные координаты (вылетел за карту), если дать приказ находясь за пределами карты (не только за игровыми, а в целом), то будет краш. Других отсылок я не нашёл.
Погляжу в псевдокоде game.dll как оно их обрабатывает, может и осилю добавить функционала Doodad'ам в кастом патче, что я делаю ну и может даже в мемхак добавлю.
С мемхаком в карту даже на иринаботе нельзя будет поиграть. Это получится варик только для себя, в который не с кем поиграть!
Что за басни? Всё прекрасно работает, тот же Naruto Legend на ирине с МемХаком, он же как-то работает? Брррр. 16GB:
Я скрывал декорации так , но это конечно не удаление
Удаление ничего не сделает, я уже глянул внутрь игры, проходимость ставится через карту путей, а сама декорация - тупо моделька, то есть надо найти ещё и её карту путей, чтобы полноценно удалить, в самой игре даже функции такой нет, ибо явно не рассчитывалось на это.
Наверное стоит заранее написать, что вообще искать надо?
нужно найти реальное имя трёх файлов
File00000652.blp
File00000653.blp
File00000654.blp
все остальные имена найдены
Имена blp если не ищутся, значит оно и не используется. Значит имя восстановить невозможно (по крайней мере без шаманизма с MPQ и парсингом имени файла, но такое вроде как не делается, ибо даже создатель MPQ Editor не знает как это сделать). Говоря проще, можешь смело эти 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'ам в кастом патче, что я делаю ну и может даже в мемхак добавлю.
Портируется ли на рефордж или же придется переделывать код?
Если речь о нативках, они будут реализованы как "врапперы" и скорее всего пойдут в Blizzard.j, но работать будут так же, ибо я не горю желанием обзывать функции Blz, но их поддержку можно сделать банальным вызовом соответствующей нативки. Просто немного бы подробнее бы расписал, что именно нужно "портировать".
Согласен, непонятно выразился.
Если допустим я сейчас буду в 1.26 писать на Lua, захочу вот перенести карту в рефордж, смогу ли я уже её редактировать в рефордже с новыми функциями рефорджа(ведь были добавлены новые функции), откроется ли она у меня, а то я так полагаю тут и мемхак частично задействован в этой сборке исходя из видео, а в рефордже его убрали насколь знаю
В идеале (по-крайней мере я попытаюсь так сделать), что можно будет прямо весь ЛУА код с рефорджа перетащить на 1.26а и наоборот, я хочу добавить поддержку всех нативок. Однако, ввиду того, что я добавлю БОЛЬШЕ чем на рефордже, то перейти с нашего патча (используя новые функции) на рефордж будет уже нельзя. То есть будет +- полная ОБРАТНАЯ совместимость, но вот совместимость "вперёд" будет в руках близзардов. :D
Портируется ли на рефордж или же придется переделывать код?
Если речь о нативках, они будут реализованы как "врапперы" и скорее всего пойдут в Blizzard.j, но работать будут так же, ибо я не горю желанием обзывать функции Blz, но их поддержку можно сделать банальным вызовом соответствующей нативки. Просто немного бы подробнее бы расписал, что именно нужно "портировать".
Первая карта (benchmark.w3m) содержит исходники скрипта.
Вторая карта (benchmark-packed.w3m) уже укомплектована DLL с нативками и готова к запуску.
Решил у себя проверить, вот разница от local integer p и local integer dddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddd
Разница в 24нс на 1 итерацию.
Дальше по поводу вызова функций, ForForce добавляет свою задержку, но хз по идее она не должна сильно повлиять, а по поводу сортировки, тут уже отсутствие оптимизации компилятора/интерпретатора, который есть даже на паскале, по этим нюансам офк джасс уступает, но я говорил непосредственно про нативки и про +- дефолтную "конвенцию" и работу со скриптами от большинства картоделов, кому эта разница не увидится нигде.
Но если уже судить по всем пунктам и сразу, то конечно же LUA будет лучше по всем параметрам в плане производительности и скорости, но у Джасса своя ниша, и куда более простой "путь" входа, что фактически является его самым большим и возможно единственным плюсом.
Это все очень хорошо, но так и не дали главный ответ - что лучше луа или джасс? Чтобы можно было закрыть этот тред
Ответ был уже дан - LUA профитнее по большим пунктам, если есть хоть чуть-чуть знания/азы программирования. Если же нет, то Джасс будет проще и быстрее освоить, да и в плане Вар 3 - я считаю что он всё-равно удобнее.
Длина переменной не влияет на скорость никак - это очередной тупой миф
Написал для теста код, что упорядочивает массив используя сортировку пузырьком.
функция сортировки
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
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 в итоге превратит в обычный джасс, хочу посмотреть и замерить тоже, но я выше показал причину дополнения задержки, с переменными похоже та же басня, что странно:
Всё-таки очень странно, что сортировка на столько дикую разницу имеет, имею сомнения как не крути.
Много интересных постов в теме, но ответа на главный вопрос так и не было. Lua или Jass?
В ситуации если доступны оба, но если с программированием ОЧЕНЬ слабо знаком - джасс будет проще для начала, но LUA был и будет перспективнее, ибо не только сможешь пилить карты в варкрафте, но и в будущем скрипты под свои нужды как для других программ, так и в целом выучишь хотя бы полезный ЯП. О чём неоднократно тут уже писали. :D
Unryze, какие наносекунды, ты же вроде офигеть какие там тулзы пишешь, ну мог бы сделать бенчмарк хотябы - там только на создание сопрограммы и нового стека и потом их убития уйма времени выделяется, что в лупе аж рендер фризился
Эти люди - не рандомы, писали тулзы и ловили вызовы через дебаггеры, тоже делали инъекции в исполняемый код. wc3c сдох и в веб архиве найти ничего не смог.
Естественно, ещё много лично с ними общался, щас таких мессенджеров уже нет
Есть контраргументы?
Мой тред про мифа Джасса - это и есть контраргумент, а по поводу функций, они в байткоде выходят в id, я не знаю что они там тестировали - кроме как пустой воздух, я же кидал байткод в моём треде для чего? Для красоты? Все функции переводятся в индексы и вызываются по НИМ, потому ДЛИНА их НАЗВАНИЯ не влияет ровно ни на что, ибо оно "компилится" в байткод ЕДИНОЖДЫ.
Я позже разберу все данные тобою ссылки, видать нужно тотально все эти бредни опровергнуть, а то не угомонитесь. :)
От части правда, но фишка в том, что 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 -> это вообще уровень бреда, убираются лишний код, что конечно же ускорит работу, мне немного аж стыдно, что ты это в пример привёл.
Установка literal (которая занимает пикосекунду?) и setvar (который глобалкой ты хотя бы раз делаешь), но да, эта фантомная разница и выдуманные 6 операций (без каких-либо пруфов) - это конечно же аргумент.
И того, что мы имеем, большинство информации банально неверная, а которая и верная - будет иметь тот же результат и на LUA (если вызвать ExecuteFunc или же TriggerExecute на LUA то бишь, будет такая же задержка, ибо это задержка ВНУТРИИГРОВАЯ - задержка движка).
Lua интерпретируется либой, написанной на си - lualib, довольно быстро, я там на тысячах векторах 60 фпс неплохо исполнял и применял к юнитам.
Жасс - древнее говно, где скорость даже зависит от длины имени переменной, медленное обращение к глобалкам, про execute func, хештейблы и прочие костыли вообще молчу.
Короче, нет желания в сотый раз всё это пережевывать, читаем статьи, вики, набираемся опыта.
Длина переменной не влияет на скорость никак - это очередной тупой миф, который я даже не знаю откуда пошёл, но вроде как от драколича (он тоже часто ошибается). Медленное обращение к глобалкам? Для тебя 1 нс - это много? ._. ExecuteFunc срабатывает за 4 нс (2 нс вызов, 2 нс хеширование строки и запись Id, последующие вызовы 2 нс), хештейбл по скорости без стриншехей 2 нс, или же 4 нс с большими цифрами.
Скорп, разница между этими языками по скорости хоть и значительна, но на фактически даже не на уровне НАНОсекунд, а практически на уровне ПИКОсекунд. В общем говоря, Джасс на удивление не такой уж и медлительный, как его считали, но в любом случае ЛУА быстрее - это факт, но разница не такая колоссальная, чтобы обливать джасс прямо тонной.
JackFastGame, причем тут скорость исполнения функции из api варкрафта и производительность самого языка. Для примера можете посмотреть как тестируются языки тут habr.com/ru/post/532432
С++ был и будет всегда быстрее чем джасс и тот же ЛУА, да и он +- в 100 раз быстрее ЛУА (который считается самым быстрым интерпретируемым языком). Но в Варкрафте в целом от этих разницы будет не большая разница, но как и сказал konvan5, если был опыт с ЛУА, то используй его, тем более если планируешь работать на рефорджеде (по-мимо проекта от Ev3nt и китайского YDWE с ЛУА варианто поработать на ЛУА вне рефорджеда и нет). Но вот по фреймам - неправда, ибо нативки и там и там есть и делать можно всё так же.
По вызову нативок, разница была в наносекунды, то бишь JASM байткод в целом обрабатывается на достаточно приемлемой скорости, но лимит Jass обработчика - это циклы, которые имеют лимит (который я не знаю где снимать) и при превышении его нормы игра просто на просто отказывается это "обрабатывать" и уходить в застой. :D
Всё в общем склоняется к твоим навыкам и восприятию ЯП, если же (без обид) тебе с трудом даются ЯП, то Jass будет тебе проще.
Fixed UI priority for UpperMenuBar, ResourceBar and Minimap buttons that would have lower priority than the Console at random.
Fixed Cooldown Indicator width in Upgrgraded UI mode not covering the whole button.
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.
Fixed HP/MP labels not being hidden when UI was hidden via ShowInterface or CinematicPanel.
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.
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.
Added Korean translation, thanks to: 까끼꾸 (Discord).
Fixed issue with RMC auto-activating, while any WFE bind for abilities/items/spellbook were held down.
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).
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.
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.
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.
Fixed a bug with Ability/Item keybinds that would use default hotkey if no ability/item was successfully pressed or it cannot be pressed.
Гильдия "Черамор" X-Forge Quro Порядок "Волчья Повесть"
Деятельность остальных сообществ я замечал. Однако это творческое объединение (Quro) окутано мраком. Я замечал какие-то собрания в войсе дискорда. Относятся ли они к этому объединению?
Технически - да, ибо фактически Vlod, Ev3nt уж точно часть этого сообщества, а я с ними делаю общий проект, просто ввиду моей занятости из-за универа, работы и т.д. прогресс немного медленный (но тестовый продукт уже есть). Нужно ещё немного потерпеть и скоро будет выкачены вкусняшки, от Ev3nt ЛУА (который вроде уже до конца доработан + возможность IO, которую вырезали в рефе, офк она урезанная и него, чтобы нельзя было выйти за папку Вар 3). От меня уже сделано 400 нативок (ещё делать тучу) ну и добавить поддержку патчей 1.24е/1.27a/1.27b/1.28f в LUA Ev3nt. Затем сделать лаунчер, который будет иметь автообновление, подгрузчик MPQ и прочие шалости. В общем работы много, она идёт и как будет +- то, что хотя бы можно показать без шаолинских фокусов - покажем.
Если же близзарды сделали это так, как я реализовал в мемхаке (то бишь меняются дефолтные данные), то чтобы изменения вступили в силу нужно пересоздать юнита. То бишь эти изменения не на выбранного юнита, а на всех юнитов с этим typeid (в твоей ситуации это все последующие Hblm и hpea).
Unryze, буду рад с вами работать. Blz wrapper уже реализован, однако у меня есть ещё идеи по его усовершенствованию. Если хотите, могу отписать вам, но чуть позже, так как испытыванию небольшие трудности с компьютером.
Буду тоже рад, не надо на "Вы", слишком уж уважительно. :D Связаться думаю будет проще по дискорду.
Ред. Unryze
» WarCraft 3 / Очень бомбит от непонимания дропа предметов
Конечно придётся все предметы ЕДИНОЖДЫ забить, а потом при триггерном срабатывании смерти виджета (проверить что это был предмет/коробка и т.д.) вызвать PlaceRandomItem( ItemPool,x,y ), с WE не знаю, что тебе там палки в колёса вставляет. :(
» WarCraft 3 / Деление голды как в доте 1
Ред. Unryze
» WarCraft 3 / Деление голды как в доте 1
» WarCraft 3 / Помогите найти ошибку
» WarCraft 3 / Помогите найти ошибку
Ред. Unryze
» WarCraft 3 / Удаление не разрушаемых объектов ( трава камни)
16GB:
» WarCraft 3 / за 300р найти 3 файла в листфайле
» WarCraft 3 / за 300р найти 3 файла в листфайле
Ред. Unryze
» WarCraft 3 / Удаление не разрушаемых объектов ( трава камни)
Полный ответ: делать велосипед и использовать либо разрушаемый объект, либо как ты уже и сказал юнита.
native SetDoodadAnimationRect takes rect r, integer doodadID, string animName, boolean animRandom returns nothing
Ред. Unryze
» Warcraft III - Lua / Warcraft III - Lua
» Warcraft III - Lua / Warcraft III - Lua
Ред. Unryze
» WarCraft 3 / Что предпочтительней и почему Lua или Jass?
» WarCraft 3 / Что предпочтительней и почему Lua или Jass?
» WarCraft 3 / Что предпочтительней и почему Lua или Jass?
Ред. Unryze
» WarCraft 3 / Что предпочтительней и почему Lua или Jass?
» WarCraft 3 / Что предпочтительней и почему Lua или Jass?
Ред. Unryze
» WarCraft 3 / Что предпочтительней и почему Lua или Jass?
» WarCraft 3 / Съехала панель
» WarCraft 3 / WinMPQ v1.64
Ред. Unryze
» WarCraft 3 / WFE - Warcraft Feature Extender
Github: github.com/UnryzeC/WFE-Release/releases
Note: it was breaking due to units not having CBuffBar at all, meaning "Status:" text was hidden along with all frames, etc.
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).
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.
Note: it was causing the "target circle" to blink, but it would still work overall.
» Quro / Quro
Ред. Unryze
» WarCraft 3 / BlzSetUnit[something]Field Всё-таки работает или нет?
» WarCraft 3 / Dark style for TESH
Ред. Unryze
» WarCraft 3 / Dark style for TESH
» Warcraft III - Lua / Warcraft III - Lua