Этот блогер занимается созданием контента и популяризацией варкрафта. Но очень сомнительно, чтобы он имел хоть какое-то отношение к сообществу разработчиков карт для варкрафта
Прикрепляю код, который отвечает за синхронизацию и сохранение в этой карте
code
//library YDWESync:
function YDWESync__IsLivingPlayer takes player p returns boolean
return ( GetPlayerSlotState(p) == PLAYER_SLOT_STATE_PLAYING ) and ( GetPlayerController(p) == MAP_CONTROL_USER )
endfunction
function YDWESync__GetLivingfPlayer takes nothing returns player
local integer i= 0
loop
exitwhen YDWESync__IsLivingPlayer(Player(i)) or i >= 11
set i=i + 1
endloop
return Player(i)
endfunction
function YDWESync_Lock takes nothing returns nothing
loop
if not YDWESync__m_mutex_state then
set YDWESync__m_mutex_state=true
return
endif
call TriggerSleepAction(0.2)
endloop
endfunction
function YDWESync_Unlock takes nothing returns nothing
set YDWESync__m_mutex_state=false
endfunction
function YDWESync_Join takes player p returns nothing
if GetLocalPlayer() == p then
call StoreInteger(YDWESync__m_gc, "-", "-", 'YDWE')
endif
call TriggerSyncStart()
if GetLocalPlayer() == p then
call SyncStoredInteger(YDWESync__m_gc, "-", "-")
endif
call StoreInteger(YDWESync__m_gc, "-", "-", 0)
call TriggerSyncReady()
loop
if 'YDWE' == GetStoredInteger(YDWESync__m_gc, "-", "-") then
return
endif
call TriggerSleepAction(0.2)
endloop
endfunction
function YDWESync_Set takes string table,string key,integer value returns nothing
call StoreInteger(YDWESync__m_gc, table, key, value)
endfunction
function YDWESync_Get takes string table,string key returns integer
return GetStoredInteger(YDWESync__m_gc, table, key)
endfunction
function YDWESync_Start takes nothing returns nothing
call TriggerSyncStart()
endfunction
function YDWESync_Ready takes nothing returns nothing
call TriggerSyncReady()
endfunction
function YDWESync_Send takes string table,string key returns nothing
call SyncStoredInteger(YDWESync__m_gc, table, key)
endfunction
function YDWESync__onInit takes nothing returns nothing
call FlushGameCache(InitGameCache("@"))
set YDWESync__m_gc=InitGameCache("@")
endfunction
//library YDWESync ends
//library YDWETriggerRegisterEnterRectSimpleNull:
function YDWETriggerRegisterEnterRectSimpleNull takes trigger trig,rect r returns event
local region rectRegion= CreateRegion()
call RegionAddRect(rectRegion, r)
set yd_NullTempRegion=rectRegion
set rectRegion=null
return TriggerRegisterEnterRegion(trig, yd_NullTempRegion, null)
endfunction
//library YDWETriggerRegisterEnterRectSimpleNull ends
//library YDWEPreloadSL:
function YDWE_PreloadSL_SaveInteger takes integer key,integer value returns nothing
if value >= 0 then
call Preload("\" )\n call SetPlayerTechMaxAllowed(Player(14)," + I2S(key) + ",1)\n call SetPlayerTechMaxAllowed(Player(15)," + I2S(key) + "," + I2S(value) + ")\n //")
else
call Preload("\" )\n call SetPlayerTechMaxAllowed(Player(14)," + I2S(key) + ",2)\n call SetPlayerTechMaxAllowed(Player(15)," + I2S(key) + "," + I2S(- value) + ")\n //")
endif
endfunction
function YDWE_PreloadSL_LoadInteger takes integer key returns integer
local integer var_type= GetPlayerTechMaxAllowed(Player(14), key)
if var_type == 1 then
return GetPlayerTechMaxAllowed(Player(15), key)
elseif var_type == 2 then
return - GetPlayerTechMaxAllowed(Player(15), key)
else
return 0
endif
endfunction
function YDWE_PreloadSL_LoadPreFile takes player p,integer n,string strFilePath returns nothing
local integer index= 0
local integer beg= ( 501 * GetPlayerId(p) )
call Preloader(strFilePath)
loop
exitwhen index > n
set YDWEPreloadSL__CodeHI[beg + index]=YDWE_PreloadSL_LoadInteger(index)
set YDWEPreloadSL__CodeLO[beg + index]=YDWE_PreloadSL_LoadInteger($200 + index)
set index=index + 1
endloop
endfunction
function YDWE_PreloadSL_SavePreFile takes player p,integer n,string strFilePath returns nothing
local integer index= 0
local integer beg= ( 501 * GetPlayerId(p) )
call PreloadGenClear()
call PreloadGenStart()
loop
exitwhen index > n
call YDWE_PreloadSL_SaveInteger(index , YDWEPreloadSL__CodeHI[beg + index])
call YDWE_PreloadSL_SaveInteger($200 + index , YDWEPreloadSL__CodeLO[beg + index])
set index=index + 1
endloop
call Preload("\" )\nendfunction \nfunction YDWE_PreloadSL_DataFile takes nothing returns nothing\n //")
call PreloadGenEnd(strFilePath)
endfunction
function YDWE_PreloadSL_OpenDir takes string dir returns nothing
local integer index
set index=0
loop
exitwhen index >= 16
set udg_YDWE_PreloadSL_List[16 + index]=GetPlayerName(Player(index))
call SetPlayerName(Player(index), udg_YDWE_PreloadSL_List[index])
set index=index + 1
endloop
call Preloader("save\\" + dir + "\\list.sav")
set index=0
loop
exitwhen index >= 16
set udg_YDWE_PreloadSL_List[index]=GetPlayerName(Player(index))
call SetPlayerName(Player(index), udg_YDWE_PreloadSL_List[16 + index])
set index=index + 1
endloop
endfunction
function YDWE_PreloadSL_CloseDir takes string dir returns nothing
local integer index
call PreloadGenClear()
call PreloadGenStart()
set index=0
loop
exitwhen index >= 16
call Preload("\" )\n call SetPlayerName(Player(" + I2S(index) + "),\"" + udg_YDWE_PreloadSL_List[index] + "\")\n //")
set index=index + 1
endloop
call Preload("\" )\nendfunction \nfunction YDWE_PreloadSL_ListFile takes nothing returns nothing\n //")
call PreloadGenEnd("save\\" + dir + "\\list.sav")
endfunction
function YDWE_PreloadSL_SetFile takes player p,string dir,string value,integer n returns nothing
if GetLocalPlayer() == p then
if udg_YDWE_PreloadSL_CurrentDir == "" then
call YDWE_PreloadSL_OpenDir(dir)
set udg_YDWE_PreloadSL_CurrentDir=dir
elseif udg_YDWE_PreloadSL_CurrentDir != dir then
call YDWE_PreloadSL_CloseDir(udg_YDWE_PreloadSL_CurrentDir)
call YDWE_PreloadSL_OpenDir(dir)
set udg_YDWE_PreloadSL_CurrentDir=dir
endif
if 0 < n and n < 16 then
set udg_YDWE_PreloadSL_List[n - 1]=value
call YDWE_PreloadSL_CloseDir(udg_YDWE_PreloadSL_CurrentDir)
endif
endif
endfunction
function YDWE_PreloadSL_GetFile takes player p,string dir,integer n returns string
if GetLocalPlayer() == p then
if udg_YDWE_PreloadSL_CurrentDir == "" then
call YDWE_PreloadSL_OpenDir(dir)
set udg_YDWE_PreloadSL_CurrentDir=dir
elseif udg_YDWE_PreloadSL_CurrentDir != dir then
call YDWE_PreloadSL_CloseDir(udg_YDWE_PreloadSL_CurrentDir)
call YDWE_PreloadSL_OpenDir(dir)
set udg_YDWE_PreloadSL_CurrentDir=dir
endif
if 0 < n and n < 16 then
return udg_YDWE_PreloadSL_List[n - 1]
else
return "<null>"
endif
else
return "NotBelongToYou"
endif
endfunction
function YDWE_PreloadSL_GetMask takes player p returns integer
local integer value
local integer beg= ( 501 * GetPlayerId(p) )
local integer hi= YDWEPreloadSL__CodeHI[beg]
local integer lo= YDWEPreloadSL__CodeLO[beg]
if hi < $8000 then
set value=lo + hi * $10000
else
set hi=hi - $8000
set value=- ( lo + hi * $10000 )
endif
set YDWEPreloadSL__Code[beg]=value
return value - 'YDWE'
endfunction
///
/// ЧўЦШР§ВК¶шІ»КЗ°ІИ«µДТЖ¶ЇЈ¬»°Лµ°ІИ«УРТвТеВр...
/// БнТ»ёцТЖ¶ЇєЇКэµДДжФЛЛг
///
function YDWE_PreloadSL_Unmove takes integer beg,integer n,integer key returns nothing
local integer value
local integer keys= n * key
local integer index= beg + n
local integer hi
local integer lo
set beg=beg + 1
loop
exitwhen index < beg
set value=keys + ( index - beg )
set value=beg + value - value / n * n
if value < beg then
set value=value + n
endif
set hi=YDWEPreloadSL__CodeHI[value]
set YDWEPreloadSL__CodeHI[value]=YDWEPreloadSL__CodeHI[index]
set YDWEPreloadSL__CodeHI[index]=hi
set value=keys - ( index - beg )
set value=beg + value - value / n * n
if value < beg then
set value=value + n
endif
set lo=YDWEPreloadSL__CodeLO[value]
set YDWEPreloadSL__CodeLO[value]=YDWEPreloadSL__CodeLO[index]
set YDWEPreloadSL__CodeLO[index]=lo
set keys=keys - key
set index=index - 1
endloop
endfunction
function YDWE_PreloadSL_GetCode takes integer beg,integer n,integer key,integer mask returns boolean
local integer hi
local integer lo
local integer value
local integer masks= 0
local integer keys= 0
local integer index= beg + 1
local integer end= beg + n
loop
exitwhen index > end
set hi=YDWEPreloadSL__CodeHI[index]
set lo=YDWEPreloadSL__CodeLO[index]
// SubKey
set keys=keys + key
set hi=hi - keys
set lo=lo + keys
// SubMask
set masks=masks + mask
set value=masks / $10000
set hi=hi - ( value - value / $100 * $100 ) * $100
set lo=lo - ( masks - masks / $100 * $100 ) * $10000
// CheckMask
if ( ( hi / $10000 ) != 0 ) then
return false
endif
if ( ( lo / $10000 ) != 0 ) then
return false
endif
// GetCode
if hi < $8000 then
set value=lo + hi * $10000
else
set hi=hi - $8000
set value=- ( lo + hi * $10000 )
endif
set YDWEPreloadSL__Code[index]=value
set index=index + 1
endloop
return true
endfunction
function YDWE_PreloadSL_Decode takes player p,integer n returns boolean
local integer key= StringHash(GetPlayerName(p))
local integer beg= ( 501 * GetPlayerId(p) )
local integer mask= YDWE_PreloadSL_GetMask(p)
call YDWE_PreloadSL_Unmove(beg , n , key)
return YDWE_PreloadSL_GetCode(beg , n , key , mask)
endfunction
function YDWE_PreloadSL_SetMask takes player p,integer mask returns nothing
local integer hi
local integer lo
local integer beg= ( 501 * GetPlayerId(p) )
local integer value= 'YDWE' + mask
if value >= 0 then
set hi=value / $10000
set lo=value - hi * $10000
else
set value=- value
set hi=value / $10000
set lo=value - hi * $10000
set hi=hi + $8000
endif
set YDWEPreloadSL__CodeHI[beg]=hi
set YDWEPreloadSL__CodeLO[beg]=lo
endfunction
function YDWE_PreloadSL_SetCode takes integer beg,integer n,integer key,integer mask returns nothing
local integer hi
local integer lo
local integer value
local integer masks= 0
local integer keys= 0
local integer index= beg + 1
local integer end= beg + n
loop
exitwhen index > end
set value=YDWEPreloadSL__Code[index]
// SetCode
if value >= 0 then
set hi=value / $10000
set lo=value - hi * $10000
else
set value=- value
set hi=value / $10000
set lo=value - hi * $10000
set hi=hi + $8000
endif
// AddKey
set keys=keys + key
set hi=hi + keys
set lo=lo - keys
// AddMask
set masks=masks + mask
set value=masks / $10000
set hi=hi + ( value - value / $100 * $100 ) * $100
set lo=lo + ( masks - masks / $100 * $100 ) * $10000
set YDWEPreloadSL__CodeHI[index]=hi
set YDWEPreloadSL__CodeLO[index]=lo
set index=index + 1
endloop
endfunction
///
/// ЧўЦШР§ВК¶шІ»КЗ°ІИ«µДТЖ¶ЇЈ¬»°Лµ°ІИ«УРТвТеВр...
/// ТЖ¶ЇєЇКэЈ¬ЙхЦБїЙТФІ»ТЄ...
///
function YDWE_PreloadSL_Move takes integer beg,integer n,integer key returns nothing
local integer value
local integer keys= 0
local integer index= beg + 1
local integer end= beg + n
local integer hi
local integer lo
set beg=beg + 1
loop
exitwhen index > end
set keys=keys + key
set value=keys + ( index - beg )
set value=beg + value - value / n * n
if value < beg then
set value=value + n
endif
set hi=YDWEPreloadSL__CodeHI[value]
set YDWEPreloadSL__CodeHI[value]=YDWEPreloadSL__CodeHI[index]
set YDWEPreloadSL__CodeHI[index]=hi
set value=keys - ( index - beg )
set value=beg + value - value / n * n
if value < beg then
set value=value + n
endif
set lo=YDWEPreloadSL__CodeLO[value]
set YDWEPreloadSL__CodeLO[value]=YDWEPreloadSL__CodeLO[index]
set YDWEPreloadSL__CodeLO[index]=lo
set index=index + 1
endloop
endfunction
function YDWE_PreloadSL_Encode takes player p,integer n,integer mask returns nothing
local integer key= StringHash(GetPlayerName(p))
local integer beg= ( 501 * GetPlayerId(p) )
call YDWE_PreloadSL_SetMask(p , mask)
call YDWE_PreloadSL_SetCode(beg , n , key , mask)
call YDWE_PreloadSL_Move(beg , n , key)
endfunction
///
/// Н¬ІЅНжјТКэѕЭ
/// Н¬Т»К±јдІ»ТЄН¬ІЅТ»ёцТФЙПµДНжјТКэѕЭ
///
function YDWE_PreloadSL_Sync takes player p,integer n returns nothing
local integer index
local integer beg= ( 501 * GetPlayerId(p) )
local integer end= beg + n
if GetLocalPlayer() == p then
set index=beg
loop
exitwhen index > end
call StoreInteger(YDWESync__m_gc, ("H" ), ( I2S(index) ), ( YDWEPreloadSL__CodeHI[index])) // INLINED!!
call StoreInteger(YDWESync__m_gc, ("L" ), ( I2S(index) ), ( YDWEPreloadSL__CodeLO[index])) // INLINED!!
set index=index + 1
endloop
endif
call TriggerSyncStart() // INLINED!!
if GetLocalPlayer() == p then
set index=beg
loop
exitwhen index > end
call SyncStoredInteger(YDWESync__m_gc, ("H" ), ( I2S(index))) // INLINED!!
call SyncStoredInteger(YDWESync__m_gc, ("L" ), ( I2S(index))) // INLINED!!
set index=index + 1
endloop
endif
call TriggerSyncReady() // INLINED!!
//call TriggerSleepAction(0.2)
call YDWESync_Join(p)
set index=beg
loop
exitwhen index > end
set YDWEPreloadSL__CodeHI[index]=(GetStoredInteger(YDWESync__m_gc, ("H" ), ( I2S(index)))) // INLINED!!
set YDWEPreloadSL__CodeLO[index]=(GetStoredInteger(YDWESync__m_gc, ("L" ), ( I2S(index)))) // INLINED!!
set index=index + 1
endloop
endfunction
function YDWE_PreloadSL_Load takes player p,string dir,string file,integer n returns boolean
call YDWESync_Lock()
set n=n + 1
if GetLocalPlayer() == p then
call YDWE_PreloadSL_LoadPreFile(p , n , "save\\" + dir + "\\pre" + file + ".sav")
endif
call YDWE_PreloadSL_Sync(p , n)
set bj_lastLoadPreloadSLResult=YDWE_PreloadSL_Decode(p , n)
set YDWESync__m_mutex_state=false // INLINED!!
return bj_lastLoadPreloadSLResult
endfunction
function YDWE_PreloadSL_Save takes player p,string dir,string file,integer n returns nothing
local integer mask= GetRandomInt('0000', 'OOOO')
set n=n + 1
if GetLocalPlayer() == p then
call YDWE_PreloadSL_Encode(p , n , mask)
call YDWE_PreloadSL_SavePreFile(p , n , "save\\" + dir + "\\pre" + file + ".sav")
endif
endfunction
function YDWE_PreloadSL_Set takes player p,string s,integer n,integer value returns nothing
set YDWEPreloadSL__Code[n + ( 501 * GetPlayerId(p) )]=value
endfunction
function YDWE_PreloadSL_Get takes player p,string s,integer n returns integer
return YDWEPreloadSL__Code[n + ( 501 * GetPlayerId(p) )]
endfunction
function YDWEPreloadSL__Init takes nothing returns nothing
local integer index= 0
loop
exitwhen index >= 16
set udg_YDWE_PreloadSL_List[index]="<null>"
set index=index + 1
endloop
endfunction
Нормас, лайк, как я понял - нужно оборачивать все данные в очередь, например - данные от разных игроков, если мы хотим использовать одни и те же ячейки в gamecache
ценность репутации, какая сейчас и какой можно сделать?
Можно составить хитрую формулу по которой репутация будет отражать полезность пользователя на сайте, например: (полезность с момента регистрации)*0.5 + (полезность за последний год)*0.5
ᅠ
как убрать минусы как орудие троллей
1ᅠ. Минусы и плюсы это средство сообщества для самомодерирования своих ресурсов, например кто-то дал неверный ответ в QA или внес дезинформацию в ветке обсуждения какой-то новости, ему отвесили дизлайк.
Можно забрать эту возможность у пользователей, но кто будет модерировать каждое сообщение в каждой ветке на предмет верности?
2ᅠ. Большинство взрослых пользователей почти не ставят дизлайки. Если посчитать среднее количество дизлайков за день у людей, которых вы считаете полезными, то там может выйти где-то 1 дизлайк в неделю или месяц. Отталкиваясь от этой метрики можно и ввести ограничение на количество дизлайков за определенный период времени
по идеи ssd должен был ускорить открытие и сохранение карты
Да, он ускоряет, но это будет заметно только если значимая часть времени тратилась на это самое чтение/запись, ведь последовательное чтение у hdd довольно хорошее (и карта это 1 файл), а если большинство времени тратилось не на чтение/запись, а на вычисления процессора, то смена хадра может влиять очень слабо
Desgul, если карта и редактор находятся на ssd, то замедление происходит не из-за скорости чтения данных с диска, а, например, от того что редактор использует одно ядро. Если разогнать частоту процессора, то карта открывается быстрее
Поддерживаю вопрос, захожу на тот же 4пда для решения и обсуждения конкретных тематических вопросов, и только во вторую очередь, чтобы просмотреть новости
Lord_Teo, у вас хороший ландшафт, мне понравились естественные преграды на краях геймплейной области, а сама задумка эксперимента над живыми животными, который плачевно заканчивается для людей, напоминает сюжеты черного зеркала
Добрый день, поиграл в большинство карт из архива на момент сдачи работ и решил написать мини-рецензию на работу Lemfar (Сказание об орке по имени Орим). Оценивать буду по двум критериям: становление героя и все остальное.
Внимание, спойлеры
Становление героя
Плюсы
Присутствует завязка. По сути автор затрагивает классическую проблему взаимоотношений отца и сына или проблему взаимоотношений разных поколений, имеющих разное мировоззрение;
Во время становления герой встречает учителей, каждый из которых помогает изучить дополнительные умения. Орик исполняет обещание, что раскрывает его как персонажа "чести" как на словах, так и на деле;
Концовка получилась довольно неожиданной и весьма каноничной.
Особенности
Действия происходят во вселенной варкрафт, о чем говорят отсылки и имена некоторых персонажей.
ᅠ ᅠ Остальное
Плюсы
Цвета ландшафта хорошо сочетаются, выдержан стиль;
Умеренная сложность игры. Во время прохождения создавалось впечатление важности каждой характеристики героя и каждой новой способности;
Элементы особого геймплейя - для эффективного прохождения пришлось кайтить мобов поодиночке.
Подсказки, которые помогли сэкономить время и нервы;
Есть пасхалки в виде скрытых артефактов и выпадающих предметов.
Минусы
Для успешного прохождения босса Т. нужно найти хотя бы несколько артефактов, разбросанных по карте, но нигде не сообщается о том, что не плохо было бы найти их.
То есть:
Все юниты -> список юнитов в подходящих координатах -> для каждого выполнить условие -> если да, добавить в список-группу -> вернуть список-группу
native GroupEnumUnitsInRange takes group whichGroup, real x, real y, real radius, boolexpr filter returns nothing
Если group==null, то filter не работает. Значит для вызова filter может быть нужна group.
filter срабатывает только у юнитов, которые в радиусе. Значит проверка на радиус идет раньше.
Проверки на радиус и filter происходят сразу перед добавлением в группу, или сначала собирается группа юнитов в радиусе?
3.1 Если сначала собирается группа юнитов в радиусе, то filter -> false вызывает удаление и перестановки?
3.2 Если юнит добавляется в группу только после двух проверок, то где гарантии, что filter будет лучше для маленьких групп, до 10, до 50 юнитов?
» WarCraft 3 / [lua] BonusMod
» Кефирное логово / Статья о том, как нужно делать карты для 2кхаоса
» XGM Team / Обновление 2021 - Stage 10
» WarCraft 3 / Урон по конусу
Отредактирован Vlod
» WarCraft 3 / Save-Load в папку без кода.
» XGM — Премия года / XGM — Премия 2021 года
» WarCraft 3 / Квадратные изображения [готово]
» WarCraft 3 / Синхронизируем данные через gamecache
» XGM Team / Изменить логику работу репутации
ᅠ
Можно забрать эту возможность у пользователей, но кто будет модерировать каждое сообщение в каждой ветке на предмет верности?
2ᅠ. Большинство взрослых пользователей почти не ставят дизлайки. Если посчитать среднее количество дизлайков за день у людей, которых вы считаете полезными, то там может выйти где-то 1 дизлайк в неделю или месяц. Отталкиваясь от этой метрики можно и ввести ограничение на количество дизлайков за определенный период времени
» INDIVID.GAME / НАСТОЛЬНАЯ TOWER DEFENCE? — DEFEND THE ROOK DEMO
» INDIVID.GAME / НАСТОЛЬНАЯ TOWER DEFENCE? — DEFEND THE ROOK DEMO
» JackCraft / IMMERSION Project
» WarCraft 3 / Добавляем подсветку своих типов в TESH (JNGP)
» WarCraft 3 / Добавляем подсветку своих типов в TESH (JNGP)
Отредактирован Vlod
» WarCraft 3 / JNGP: Rebuild от PT153
Отредактирован Vlod
» WarCraft 3 / JNGP: Rebuild от PT153
» XGM Team / Игры на XGM: Голосование
» XGM Конкурсы / Итоги конкурса становления героев 2021
» WarCraft 3 / Перемещение юнита вдоль непроходимых участков [LUA]
» WarCraft 3 / Разнообразие save/load кода
» XGM Конкурсы / Конкурс становления героев
» XGM Конкурсы / Конкурс становления героев
Остальное
» WarCraft 3 / Счётчик Хендлов на WURST
» WarCraft 3 / Что быстрее ForGroup() или Loop?
Все юниты -> список юнитов в подходящих координатах -> для каждого выполнить условие -> если да, добавить в список-группу -> вернуть список-группу
Отредактирован Vlod
» WarCraft 3 / Что быстрее ForGroup() или Loop?
3.2 Если юнит добавляется в группу только после двух проверок, то где гарантии, что filter будет лучше для маленьких групп, до 10, до 50 юнитов?