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

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

Закрытая тема
 
Blizzru

offline
Опыт: 4,117
Активность:
Система убийств
Скачал наработку с системой убийств, установил, работает, но как-то не правильно. Какбудто таймер не обнуляется. DoubleKill может проигрываться даже при первом убийстве...
function Trig_Spree_Actions takes nothing returns nothing
    set udg_SPREE_NEXT_KILL_MAXIMUM_TIMER = 10
    
    set udg_SPREE_NEXT_KILL_SOUND[2] = gg_snd_Double
    set udg_SPREE_NEXT_KILL_SOUND[3] = gg_snd_Triple
    set udg_SPREE_NEXT_KILL_SOUND[4] = gg_snd_Ultra
    set udg_SPREE_NEXT_KILL_SOUND[5] = gg_snd_Rampage
    
    set udg_SPREE_SOUND[1] = gg_snd_Owning
    set udg_SPREE_SOUND[3] = gg_snd_KillingSpree
    set udg_SPREE_SOUND[4] = gg_snd_Dominating
    set udg_SPREE_SOUND[5] = gg_snd_MegaKill
    set udg_SPREE_SOUND[6] = gg_snd_MonsterKill
    set udg_SPREE_SOUND[7] = gg_snd_WhickedSick
    set udg_SPREE_SOUND[8] = gg_snd_Juggernaut
    set udg_SPREE_SOUND[9] = gg_snd_Unreal
    set udg_SPREE_SOUND[10] = gg_snd_HolyShit
    set udg_SPREE_SOUND[11] = gg_snd_Unstoppable
    set udg_SPREE_SOUND[12] = gg_snd_GodLike
    
    set udg_Playername[1] = ( "|c00ff0303" + ( GetPlayerName(Player(0)) + "|r" ) )
    set udg_Playername[2] = ( "|c000042ff" + ( GetPlayerName(Player(1)) + "|r" ) )
    set udg_Playername[3] = ( "|c001ce6b9" + ( GetPlayerName(Player(2)) + "|r" ) )
    set udg_Playername[4] = ( "|c00540081" + ( GetPlayerName(Player(3)) + "|r" ) )
    set udg_Playername[5] = ( "|c00fffc01" + ( GetPlayerName(Player(4)) + "|r" ) )
    set udg_Playername[6] = ( "|c00feba0e" + ( GetPlayerName(Player(5)) + "|r" ) )
    set udg_Playername[7] = ( "|c0020c000" + ( GetPlayerName(Player(6)) + "|r" ) )
    set udg_Playername[8] = ( "|c00e55bb0" + ( GetPlayerName(Player(7)) + "|r" ) )
    set udg_Playername[9] = ( "|c00959697" + ( GetPlayerName(Player(8)) + "|r" ) )
    set udg_Playername[10] = ( "|c007ebff1" + ( GetPlayerName(Player(9)) + "|r" ) )
    set udg_Playername[11] = ( "|c00106246" + ( GetPlayerName(Player(10)) + "|r" ) )
    set udg_Playername[12] = ( "|c004e2a04" + ( GetPlayerName(Player(11)) + "|r" ) )
endfunction

//===========================================================================
function InitTrig_Shpree takes nothing returns nothing
    set gg_trg_Shpree = CreateTrigger(  )
    call TriggerRegisterTimerEventSingle( gg_trg_Shpree, 0.00 )
    call TriggerAddAction( gg_trg_Shpree, function Trig_Spree_Actions )
endfunction
"

Триггер "Die" находится в папке "Киллерство"

"
function Trig_Die_Conditions takes nothing returns boolean
    if ( not ( IsUnitType(GetTriggerUnit(), UNIT_TYPE_HERO) == true ) ) then
        return false
    endif
    if ( not ( IsPlayerEnemy(GetOwningPlayer(GetTriggerUnit()), GetOwningPlayer(GetKillingUnitBJ())) == true ) ) then
        return false
    endif
    return true
endfunction

function Trig_Die_Func005C takes nothing returns boolean
    if ( not ( udg_Make_Kill == true ) ) then
        return false
    endif
    return true
endfunction

function Trig_Die_Func006C takes nothing returns boolean
    if ( not ( udg_First_Blood == false ) ) then
        return false
    endif
    if ( not ( GetOwningPlayer(GetKillingUnitBJ()) != Player(PLAYER_NEUTRAL_AGGRESSIVE) ) ) then
        return false
    endif
    if ( not ( GetOwningPlayer(GetKillingUnitBJ()) != GetOwningPlayer(GetDyingUnit()) ) ) then
        return false
    endif
    if ( not ( IsUnitType(GetDyingUnit(), UNIT_TYPE_HERO) == true ) ) then
        return false
    endif
    return true
endfunction

function Trig_Die_Func007C takes nothing returns boolean
    if ( not ( udg_SPREE_INTEGER[GetConvertedPlayerId(GetOwningPlayer(GetKillingUnitBJ()))] == 1 ) ) then
        return false
    endif
    return true
endfunction

function Trig_Die_Func008C takes nothing returns boolean
    if ( not ( udg_SPREE_INTEGER[GetConvertedPlayerId(GetOwningPlayer(GetKillingUnitBJ()))] == 3 ) ) then
        return false
    endif
    return true
endfunction

function Trig_Die_Func009C takes nothing returns boolean
    if ( not ( udg_SPREE_INTEGER[GetConvertedPlayerId(GetOwningPlayer(GetKillingUnitBJ()))] == 4 ) ) then
        return false
    endif
    return true
endfunction

function Trig_Die_Func010C takes nothing returns boolean
    if ( not ( udg_SPREE_INTEGER[GetConvertedPlayerId(GetOwningPlayer(GetKillingUnitBJ()))] == 5 ) ) then
        return false
    endif
    return true
endfunction

function Trig_Die_Func011C takes nothing returns boolean
    if ( not ( udg_SPREE_INTEGER[GetConvertedPlayerId(GetOwningPlayer(GetKillingUnitBJ()))] == 6 ) ) then
        return false
    endif
    return true
endfunction

function Trig_Die_Func012C takes nothing returns boolean
    if ( not ( udg_SPREE_INTEGER[GetConvertedPlayerId(GetOwningPlayer(GetKillingUnitBJ()))] == 7 ) ) then
        return false
    endif
    return true
endfunction

function Trig_Die_Func013C takes nothing returns boolean
    if ( not ( udg_SPREE_INTEGER[GetConvertedPlayerId(GetOwningPlayer(GetKillingUnitBJ()))] == 8 ) ) then
        return false
    endif
    return true
endfunction

function Trig_Die_Func014C takes nothing returns boolean
    if ( not ( udg_SPREE_INTEGER[GetConvertedPlayerId(GetOwningPlayer(GetKillingUnitBJ()))] == 9 ) ) then
        return false
    endif
    return true
endfunction

function Trig_Die_Func015C takes nothing returns boolean
    if ( not ( udg_SPREE_INTEGER[GetConvertedPlayerId(GetOwningPlayer(GetKillingUnitBJ()))] == 10 ) ) then
        return false
    endif
    return true
endfunction

function Trig_Die_Func016C takes nothing returns boolean
    if ( not ( udg_SPREE_INTEGER[GetConvertedPlayerId(GetOwningPlayer(GetKillingUnitBJ()))] == 11 ) ) then
        return false
    endif
    return true
endfunction

function Trig_Die_Func017C takes nothing returns boolean
    if ( not ( udg_SPREE_INTEGER[GetConvertedPlayerId(GetOwningPlayer(GetKillingUnitBJ()))] >= 12 ) ) then
        return false
    endif
    return true
endfunction

function Trig_Die_Func018C takes nothing returns boolean
    if ( not ( udg_SPREE_NEXT_KILL[GetConvertedPlayerId(GetOwningPlayer(GetKillingUnitBJ()))] == 2 ) ) then
        return false
    endif
    return true
endfunction

function Trig_Die_Func019C takes nothing returns boolean
    if ( not ( udg_SPREE_NEXT_KILL[GetConvertedPlayerId(GetOwningPlayer(GetKillingUnitBJ()))] == 3 ) ) then
        return false
    endif
    return true
endfunction

function Trig_Die_Func020C takes nothing returns boolean
    if ( not ( udg_SPREE_NEXT_KILL[GetConvertedPlayerId(GetOwningPlayer(GetKillingUnitBJ()))] == 4 ) ) then
        return false
    endif
    return true
endfunction

function Trig_Die_Func021C takes nothing returns boolean
    if ( not ( udg_SPREE_NEXT_KILL[GetConvertedPlayerId(GetOwningPlayer(GetKillingUnitBJ()))] >= 5 ) ) then
        return false
    endif
    return true
endfunction

function Trig_Die_Actions takes nothing returns nothing
    set udg_SPREE_INTEGER[GetConvertedPlayerId(GetOwningPlayer(GetKillingUnitBJ()))] = ( udg_SPREE_INTEGER[GetConvertedPlayerId(GetOwningPlayer(GetKillingUnitBJ()))] + 1 )
    set udg_SPREE_INTEGER[GetConvertedPlayerId(GetOwningPlayer(GetTriggerUnit()))] = 0
    set udg_SPREE_NEXT_KILL[GetConvertedPlayerId(GetOwningPlayer(GetKillingUnitBJ()))] = ( udg_SPREE_NEXT_KILL[GetConvertedPlayerId(GetOwningPlayer(GetKillingUnitBJ()))] + 1 )
    set udg_SPREE_TIMER[GetConvertedPlayerId(GetOwningPlayer(GetKillingUnitBJ()))] = udg_SPREE_NEXT_KILL_MAXIMUM_TIMER
    if ( Trig_Die_Func005C() ) then
        set udg_Kill_Points[GetConvertedPlayerId(GetOwningPlayer(GetKillingUnitBJ()))] = ( udg_Kill_Points[GetConvertedPlayerId(GetOwningPlayer(GetKillingUnitBJ()))] + 1 )
        set udg_Killing_Spree[GetConvertedPlayerId(GetOwningPlayer(GetKillingUnitBJ()))] = ( udg_Killing_Spree[GetConvertedPlayerId(GetOwningPlayer(GetKillingUnitBJ()))] + 1 )
    else
    endif
    if ( Trig_Die_Func006C() ) then
        call DisplayTimedTextToForce( GetPlayersAll(), 10.00, ( GetPlayerName(GetOwningPlayer(GetKillingUnitBJ())) + ( " Фрагнул " + ( GetPlayerName(GetOwningPlayer(GetKillingUnitBJ())) + ". |cffff0000Первая кровь!!!|r |cFFEEEE64+200 голд.|r" ) ) ) )
        call PlaySoundBJ( gg_snd_First )
        call AdjustPlayerStateBJ( 200, GetOwningPlayer(GetKillingUnitBJ()), PLAYER_STATE_RESOURCE_GOLD )
        call AdjustPlayerStateBJ( -100, GetOwningPlayer(GetDyingUnit()), PLAYER_STATE_RESOURCE_GOLD )
        set udg_First_Blood = true
    else
    endif
    if ( Trig_Die_Func007C() ) then
        call DisplayTextToForce( GetPlayersAll(), ( udg_Playername[GetConvertedPlayerId(GetOwningPlayer(GetKillingUnitBJ()))] + " |c00990099Ownage|r!" ) )
        call PlaySoundBJ( udg_SPREE_SOUND[1] )
    else
    endif
    if ( Trig_Die_Func008C() ) then
        call DisplayTextToForce( GetPlayersAll(), ( udg_Playername[GetConvertedPlayerId(GetOwningPlayer(GetKillingUnitBJ()))] + " has a |cff0000FFKillingspree|r!" ) )
        call PlaySoundBJ( udg_SPREE_SOUND[3] )
    else
    endif
    if ( Trig_Die_Func009C() ) then
        call DisplayTextToForce( GetPlayersAll(), ( udg_Playername[GetConvertedPlayerId(GetOwningPlayer(GetKillingUnitBJ()))] + " has a |c00ff9900Dominating|r!" ) )
        call PlaySoundBJ( udg_SPREE_SOUND[4] )
    else
    endif
    if ( Trig_Die_Func010C() ) then
        call DisplayTextToForce( GetPlayersAll(), ( udg_Playername[GetConvertedPlayerId(GetOwningPlayer(GetKillingUnitBJ()))] + " has a |c00ff33ffMega Kill|r!" ) )
        call PlaySoundBJ( udg_SPREE_SOUND[5] )
    else
    endif
    if ( Trig_Die_Func011C() ) then
        call DisplayTextToForce( GetPlayersAll(), ( udg_Playername[GetConvertedPlayerId(GetOwningPlayer(GetKillingUnitBJ()))] + " is |c00990000Monster kill|r!" ) )
        call PlaySoundBJ( udg_SPREE_SOUND[6] )
    else
    endif
    if ( Trig_Die_Func012C() ) then
        call DisplayTextToForce( GetPlayersAll(), ( udg_Playername[GetConvertedPlayerId(GetOwningPlayer(GetKillingUnitBJ()))] + " is |c009933ffWhickedsick|r!" ) )
        call PlaySoundBJ( udg_SPREE_SOUND[7] )
    else
    endif
    if ( Trig_Die_Func013C() ) then
        call DisplayTextToForce( GetPlayersAll(), ( udg_Playername[GetConvertedPlayerId(GetOwningPlayer(GetKillingUnitBJ()))] + " has a |c0099ff33Juggernaut|r!" ) )
        call PlaySoundBJ( udg_SPREE_SOUND[8] )
    else
    endif
    if ( Trig_Die_Func014C() ) then
        call DisplayTextToForce( GetPlayersAll(), ( udg_Playername[GetConvertedPlayerId(GetOwningPlayer(GetKillingUnitBJ()))] + " is |c00000066Unreal|r!" ) )
        call PlaySoundBJ( udg_SPREE_SOUND[9] )
    else
    endif
    if ( Trig_Die_Func015C() ) then
        call DisplayTextToForce( GetPlayersAll(), ( udg_Playername[GetConvertedPlayerId(GetOwningPlayer(GetKillingUnitBJ()))] + " is |c00ffff00Holy Shit|r!" ) )
        call PlaySoundBJ( udg_SPREE_SOUND[10] )
    else
    endif
    if ( Trig_Die_Func016C() ) then
        call DisplayTextToForce( GetPlayersAll(), ( udg_Playername[GetConvertedPlayerId(GetOwningPlayer(GetKillingUnitBJ()))] + " is |c00990000Unstoppable|r!" ) )
        call PlaySoundBJ( udg_SPREE_SOUND[11] )
    else
    endif
    if ( Trig_Die_Func017C() ) then
        call DisplayTextToForce( GetPlayersAll(), ( udg_Playername[GetConvertedPlayerId(GetOwningPlayer(GetKillingUnitBJ()))] + " is |c000099ffGod Like|r!" ) )
        call PlaySoundBJ( udg_SPREE_SOUND[12] )
    else
    endif
    if ( Trig_Die_Func018C() ) then
        call DisplayTextToForce( GetPlayersAll(), ( udg_Playername[GetConvertedPlayerId(GetOwningPlayer(GetKillingUnitBJ()))] + " has a |cffE8B57DDouble Kill|r!" ) )
        call PlaySoundBJ( udg_SPREE_NEXT_KILL_SOUND[2] )
    else
    endif
    if ( Trig_Die_Func019C() ) then
        call DisplayTextToForce( GetPlayersAll(), ( udg_Playername[GetConvertedPlayerId(GetOwningPlayer(GetKillingUnitBJ()))] + " has a |cff0000FFTripple Kill|r!" ) )
        call PlaySoundBJ( udg_SPREE_NEXT_KILL_SOUND[3] )
    else
    endif
    if ( Trig_Die_Func020C() ) then
        call DisplayTextToForce( GetPlayersAll(), ( udg_Playername[GetConvertedPlayerId(GetOwningPlayer(GetKillingUnitBJ()))] + " has an |c009999ffUltra Kill|r!" ) )
        call PlaySoundBJ( udg_SPREE_NEXT_KILL_SOUND[4] )
    else
    endif
    if ( Trig_Die_Func021C() ) then
        call DisplayTextToForce( GetPlayersAll(), ( udg_Playername[GetConvertedPlayerId(GetOwningPlayer(GetKillingUnitBJ()))] + " is on a |c00ff6600Rampage|r!" ) )
        call PlaySoundBJ( udg_SPREE_NEXT_KILL_SOUND[5] )
    else
    endif
endfunction

//===========================================================================
function InitTrig_Die takes nothing returns nothing
    set gg_trg_Die = CreateTrigger(  )
    call TriggerRegisterAnyUnitEventBJ( gg_trg_Die, EVENT_PLAYER_UNIT_DEATH )
    call TriggerAddCondition( gg_trg_Die, Condition( function Trig_Die_Conditions ) )
    call TriggerAddAction( gg_trg_Die, function Trig_Die_Actions )
endfunction
"

Триггер "Next Kill" находится в папке "Киллерство"

"
function Trig_Next_Kill_Func001Func002C takes nothing returns boolean
    if ( not ( udg_SPREE_TIMER[GetForLoopIndexA()] == 0 ) ) then
        return false
    endif
    return true
endfunction

function Trig_Next_Kill_Actions takes nothing returns nothing
    set bj_forLoopAIndex = 1
    set bj_forLoopAIndexEnd = 12
    loop
        exitwhen bj_forLoopAIndex > bj_forLoopAIndexEnd
        set udg_SPREE_TIMER[GetForLoopIndexA()] = ( udg_SPREE_TIMER[GetForLoopIndexA()] - 1 )
        if ( Trig_Next_Kill_Func001Func002C() ) then
            set udg_SPREE_NEXT_KILL[GetForLoopIndexA()] = 0
        else
        endif
        set bj_forLoopAIndex = bj_forLoopAIndex + 1
    endloop
endfunction

//===========================================================================
function InitTrig_Next_Kill takes nothing returns nothing
    set gg_trg_Next_Kill = CreateTrigger(  )
    call TriggerRegisterTimerEventPeriodic( gg_trg_Next_Kill, 1.00 )
    call TriggerAddAction( gg_trg_Next_Kill, function Trig_Next_Kill_Actions )
endfunction
[+] замечание от Nerevar: Используйте теги форматирования!

Отредактировано Blizzru, 16.09.2012 в 23:59.
Старый 16.09.2012, 23:42
alexprey
познающий Unity
offline
Опыт: 68,501
Активность:
Blizzru,
  1. не понятно суть вопроса
  2. нафига скрины?
Старый 16.09.2012, 23:54
Blizzru

offline
Опыт: 4,117
Активность:
Мог бы хотябы карту для приличия оставить
Blizzru добавил:
Спасибо за правильные тэги) Я долго с ними мучился)
Прикрепленные файлы
Тип файла: w3x Life of Secret World v1.o.w3x (783.2 Кбайт, 10 просмотров )
Старый 17.09.2012, 00:03
DioD

offline
Опыт: 45,134
Активность:
такая система делается буквально в 10 строк, при чём не только для игрока но и для индивидуальных юнитов.
всё что нужно для написания почитать что такое OOP (я учил яву, но не буду советовать) что такое штрампы времени и что такое сборка мусора.
	public void TestEvent(PlayerInteractEvent event)  
	{
	//не хочу открывать редактор, буду писать на яве, данное событие считать 
	//событием убийства
	//Обратите внимание на хеш таблицу и как она декларирована, это имеет значение

	//как вы будете получать время в игре меня не волнует, используйте таймеры.
	assert TRAKER.get(event.getPlayer()) != null : TRAKER.put(event.getPlayer(),new KillData((short)1,System.currentTimeMillis()));
	//если игрока нет в таблице мы его добавляем и ставим значение 1
	//в этом случае после ассерта выполнение кода будет окончено
	
	//игрок уже есть в таблице, смотрим что мы на него повесили
	KillData check = TRAKER.get(event.getPlayer());
	long Rift = System.currentTimeMillis() - check.Time;
	//считаем 10 секунд
	if (Rift >= 10000)
		{
		TRAKER.put(event.getPlayer(),new KillData((short)1,System.currentTimeMillis()));
		}
		//если 10 секунд прошло с момента последнего убийства, то это новый сет убийств
	else
	{
	//а если не прошло то продолжение старого
	check.Time = System.currentTimeMillis();
	++check.Kills;
	//ВОТ ЗДЕСЬ МЫ МОЖЕМ ВЫЗЫВАТЬ ФУНКЦИЮ КИЛСТРИКА которая актуально будет выдавать число убийств за последние 10 секунд
	}
Итого 8 активных строк, которые прекрасно сжимаются до 5;
Старый 17.09.2012, 15:45
Doc

offline
Опыт: 63,163
Активность:
DioD, ты код у бомжей учился писать?)
Старый 17.09.2012, 18:18
bee
vjass.optimizer
offline
Опыт: 16,615
Активность:
DioD, что с тобой не так?
Старый 17.09.2012, 19:05
alexprey
познающий Unity
offline
Опыт: 68,501
Активность:
Doc, в браузере писать не удобно. Вроде все норм, хотя
++check.Kills; напрягает
Старый 17.09.2012, 19:09
Doc

offline
Опыт: 63,163
Активность:
alexprey, норм условие вместо ассерта тоже неудобно?)
Старый 17.09.2012, 19:19
alexprey
познающий Unity
offline
Опыт: 68,501
Активность:
Doc, если расскажешь что такое assert, то может тоже покритикую
Старый 17.09.2012, 20:28
Doc

offline
Опыт: 63,163
Активность:
Старый 18.09.2012, 01:21
bee
vjass.optimizer
offline
Опыт: 16,615
Активность:
ребят это Jass форум :(
Старый 18.09.2012, 07:41
DioD

offline
Опыт: 45,134
Активность:
код совершенно правильный и отлично документированный, вы просто завидуете, сначала добейтесь.
Старый 18.09.2012, 10:08
ScorpioT1000
Работаем
offline
Опыт: отключен
суть такова:
  • игрок убил игрока
    • игрок уже убивал игрока за последние z секунд? да
      • прибавить счетчик убийств на 1
      • запомнить время убийства
    • нет
      • счетчик убийств был создан? да
        • сбросить счетчик на значение 1
        • запомнить время убийства
      • нет
        • создать счетчик убийств для игрока
        • сбросить счетчик на значение 1
        • запомнить время убийства
Старый 18.09.2012, 10:30
Blizzru

offline
Опыт: 4,117
Активность:
ScorpioT1000, Да! не пойму где ошибка. Всё перечитал... багает, как будто счётчик не обнуляется... или значение не падает до изначального числа. да и система грамоздкая... тяжело найти ошибку.
Старый 18.09.2012, 19:13
DioD

offline
Опыт: 45,134
Активность:
раз тонко не получается "намекну" толсто - твой код должен быть переписан с нуля учитывая то что здесь сказали и всё будет окей.
Старый 18.09.2012, 20:32
Blizzru

offline
Опыт: 4,117
Активность:
DioD:
твой код
не мой код...
Старый 26.09.2012, 20:04
Nerevar
I'll be back!
offline
Опыт: 18,352
Активность:
DioD:
код должен быть переписан с нуля учитывая то что здесь сказали и всё будет окей
this^
тем более если код не твой
Старый 27.09.2012, 00:29
Закрытая тема

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

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

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

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



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