18

» WarCraft 3 / wh40k Vanguard Strike

А кто то тестировал карту? Потому что:
  • захват точек иногда не работает;
  • точки не дают видимость;
  • на точках спавнятся какие-то крипы;
  • в замесах 1 фпс.
Загруженные файлы
18

» WarCraft 3 / Опрос фанатов WC3 по улучшению редактора карт

Прикольная идея, но кажется это сделает бесполезным все текущие мануалы по jass. Если вы действительно хотите облегчить написание кода разработчикам, то предложил бы создать документацию к jass api, потому что api без документации - бесполезное api
18

» WarCraft 3 / ИИ на Заказ (платный)

Дорого. Каждый из вышеперечисленных пунктов является отдельной системой. Плюсом будет то что каждая из них может быть написана независимо.
  • Например для первой системы нужно составлять базу данных предметов которых ии может поднимать, закупать, собирать, с идентификаторами, по которым ии сможет понимать как данный предмет будет ему полезен, и это исключительно для данной карты.
Затем все системы подключаются к общей архитектуре ии. Jass не самый производительный язык и с большой вероятностью нужно будет проводить дополнительные оптимизации для устранения лагов во время замесов или при большом количестве ии.
Еще вариант найти того кто уже написал все или почти все и чтобы он сделал ctrl+c ctrl+v в вашу карту
18

» WarCraft 3 / Паймон

Больше контента из геншина! Там же есть слаймы, мобы, персы, эффекты и способности
18

» Администрация XGM / Правила пользования сайтом

tysch_tysch, спасибо, я понял ScorpioT1000, что обсуждать можно, но без вреда репутации.
люди реагируют на провокации и работа психологически тяжёлая – поэтому мы ограждаем их от излишней агрессии из вне
В таком случае я бы предложил скрыть для пользователей информацию о том, кто выдал варн. Тогда для пользователя это может быть как администратор, так и любой из модераторов. Потому что обычно реакция на варн еще сильнее, чем на минусы
К примеру, на 4pda варны выдаются безличностно, и даже если сотрудник условно накосячил, есть возможность решить на месте и внутри команды. Там также есть публичная страница, где люди могут писать свои жалобы и получать ответы. Это лишь один из вариантов как люди организовали работу и защитили своих модераторов
18

» Администрация XGM / Правила пользования сайтом

А вы уже пересмотрели кажется, только на xgm и его сервисах, я правильно понял?
18

» Администрация XGM / Правила пользования сайтом

Обратите особое внимание на пункты ОДМ, оффтоп и про доступы.
Рекомендую пересмотреть пункт 3.1
3.1 Любое обсуждение действий модераторов (ОДМ) на XGM, его каналах, так и за пределами XGM.
Поскольку это:
  • Противоречит свободе мысли и слова;
  • Принуждение к отказу от выражения своих мнений и убеждений.
Что является нарушением Конституции РФ ст. 29 п. 1 и 3.
18

» WarCraft 3 / [lua] Обмен данных между картами без ввода -save -load кода

MaximBit, для того чтобы читать и писать в файл в мультиплеере надо:
  • Делать это локально для каждого игрока;
  • После чтения - синхронизировать данные между всеми игроками.
18

» WarCraft 3 / [lua] BonusMod

МрачныйВорон, ты решил добавить через способности степени двойки скорость атаки?
18

» Кефирное логово / Статья о том, как нужно делать карты для 2кхаоса

Этот блогер занимается созданием контента и популяризацией варкрафта. Но очень сомнительно, чтобы он имел хоть какое-то отношение к сообществу разработчиков карт для варкрафта
18

» Администрация XGM / Обновление 2021 - Stage 10

Agren, теперь будут писать дизлайк прямо в комментарии. Это сделано для того чтобы увеличить количество негатива на сайте
18

» WarCraft 3 / Урон по конусу

Меня, собственно, и интересует, как правильно посчитать угол.
real angle = Atan2(ty-y, tx-x) // x,y - custer; tx,ty - target
18

» WarCraft 3 / Save-Load в папку без кода.

Прикрепляю код, который отвечает за синхронизацию и сохранение в этой карте
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 
18

» WarCraft 3 / Синхронизируем данные через gamecache

Нормас, лайк, как я понял - нужно оборачивать все данные в очередь, например - данные от разных игроков, если мы хотим использовать одни и те же ячейки в gamecache
18

» XGM Team / Изменить логику работу репутации

ценность репутации, какая сейчас и какой можно сделать?
Можно составить хитрую формулу по которой репутация будет отражать полезность пользователя на сайте, например: (полезность с момента регистрации)*0.5 + (полезность за последний год)*0.5
как убрать минусы как орудие троллей
1ᅠ. Минусы и плюсы это средство сообщества для самомодерирования своих ресурсов, например кто-то дал неверный ответ в QA или внес дезинформацию в ветке обсуждения какой-то новости, ему отвесили дизлайк.
Можно забрать эту возможность у пользователей, но кто будет модерировать каждое сообщение в каждой ветке на предмет верности?
2ᅠ. Большинство взрослых пользователей почти не ставят дизлайки. Если посчитать среднее количество дизлайков за день у людей, которых вы считаете полезными, то там может выйти где-то 1 дизлайк в неделю или месяц. Отталкиваясь от этой метрики можно и ввести ограничение на количество дизлайков за определенный период времени