Восстановление модели

Статус
Новые ответы в этой теме размещать нельзя.

rxki

Пользователь
Регистрация
5 Янв 2019
Сообщения
148
Симпатии
2
Пол
Мужской
#1
Ребятки, помогите разобраться. В общем, в TD моде есть событие прикосновение монстра к башне. Когда монстр проходет через всю трассу и соприкасается с башней в конце - у башни снимает жизни, а сама она проваливается немного. Тоесть, чем больше монстров проходит к ней - тем ниже она опускается. Эту башню можно чинить. Но вот когда восстанавливаешь ей жизни - сама моделька обратно не поднимается. Подскажите, как можно реализовать это визуальное восстановление?

Вот все паблики.в котором упоминается эта башня и описываются эффекты.

PHP:
public ResetTowerOrigin()
{
    if(g_TowerHealth == g_ConfigValues[CFG_TOWER_HEALTH])
        return;

    new iTower;
    if( (iTower = find_ent_by_class(-1, "tower")) )
    {
        new Float:fOrigin[3];
        entity_get_vector(iTower, EV_VEC_origin, fOrigin);

        fOrigin[2] += 225.0;

        entity_set_origin(iTower, fOrigin);
        drop_to_floor(iTower);
    }
}

public TowerExplodeEffect() // это, видимо, тот самый эффект при прикосновении монстра с башней
{
    static iEnt;
    static fEndOrigin[3];

    if(!iEnt)
    {
        new Float:fTemp[3];

        iEnt = find_ent_by_class(-1, "tower");
        entity_get_vector(iEnt, EV_VEC_origin, fTemp);

        FVecIVec(fTemp, fEndOrigin)
    }

    message_begin(MSG_BROADCAST ,SVC_TEMPENTITY)
    write_byte(TE_EXPLOSION)
    write_coord(fEndOrigin[0])
    write_coord(fEndOrigin[1])
    write_coord(fEndOrigin[2])
    write_short(g_SpriteExplode)
    write_byte(50)
    write_byte(10)
    write_byte(0)
    message_end()
}

public _td_update_tower_origin(iMode, Float:fDamage, iExplode) // или этот)
 {
    if(g_IsTowerModelOnMap)
    {
        new Float:fOrigin[3];

        new iTower = find_ent_by_class(-1, "tower");
        entity_get_vector(iTower, EV_VEC_origin, fOrigin);

        if(iMode == 0)
            fOrigin[2] -= ( 225.0 / ( float( g_ConfigValues[CFG_TOWER_HEALTH])  / fDamage ) )
        else
            fOrigin[2] += ( 225.0 / ( float( g_ConfigValues[CFG_TOWER_HEALTH])  / fDamage ) )

        if(iExplode && g_IsTowerModelOnMap)
            TowerExplodeEffect()

        entity_set_vector(iTower,EV_VEC_origin,  fOrigin)
    }
}

public PlayerIsInRepairZone(id) // думаю, в этот паблик нужно как то вставить визуальное восстановление башни
{
    id -= TASK_IS_IN_REPAIR_ZONE;

    new entlist[2]
    static maxTowerHealth;
    if(!maxTowerHealth) maxTowerHealth = g_ConfigValues[CFG_TOWER_HEALTH]

    if(!find_sphere_class(id, "repairzone", 1.0 , entlist, 1))
    {
        g_IsPlayerInRepairZone[id] = false;

        if(id == g_TowerUpgradingPlayerIndex)
            g_TowerUpgradingPlayerIndex = 0;

        return;
    }
    static cost;
    if(!cost) cost = g_ConfigValues[CFG_REPAIR_ZONE_COST];

    if(cs_get_user_money(id) < cost)
    {
        if(g_TowerHealth  >= maxTowerHealth)
        {
            set_hudmessage(255, 0, 0, 0.02, 0.88, 1, 1.0, 2.1, 0.2, 0.2, -1)
            ShowSyncHudMsg(id, g_SyncHudRepair, "Башня не повреждена");
        }
        else
        {
            set_hudmessage(255, 0, 0, 0.02, 0.88, 1, 1.0, 2.1, 0.2, 0.2, -1)
            ShowSyncHudMsg(id, g_SyncHudRepair, "У тебя нет %d$", cost);
        }
        set_task(1.0, "PlayerIsInRepairZone", id + TASK_IS_IN_REPAIR_ZONE)

        return;
    }
    if(g_ConfigValues[CFG_REPAIR_ZONE_ONE_PLAYER] == 1)
    {
        if(g_TowerUpgradingPlayerIndex != id && g_TowerUpgradingPlayerIndex != 0)
        {
            set_hudmessage(60, 255, 0, 0.02, 0.86, 1, 1.0, 2.1, 0.2, 0.2, -1)
            ShowSyncHudMsg(id, g_SyncHudRepair, "Башня ремонтируется другим игроком");

            set_task(1.0, "PlayerIsInRepairZone", id + TASK_IS_IN_REPAIR_ZONE)
            return;
        }
    }

    static playerTime; playerTime =  g_PlayerTimeInRepairZone[id]
    static maxBlocks; maxBlocks = g_ConfigValues[CFG_REPAIR_ZONE_BLOCKS];

    g_TowerUpgradingPlayerIndex  = id;

    if(playerTime == 0)
    {
        if(g_TowerHealth == maxTowerHealth)
        {
            set_hudmessage(255, 0, 0, 0.02, 0.86, 1, 1.0, 2.1, 0.2, 0.2, -1)
            ShowSyncHudMsg(id, g_SyncHudRepair, "Башня не повреждена");
        }
        else if((++g_PlayerRepairedBlock[id]) == maxBlocks || maxBlocks == 0)
        {
            new szName[33];
            get_user_name(id, szName, 32);

            set_hudmessage(0, 255, 0, 0.02, 0.86, 1, 1.0, 2.1, 0.2, 0.2, -1)
            ShowSyncHudMsg(id, g_SyncHudRepair, "Башня отремонтирована");

            static amount;
            if(!amount) amount = g_ConfigValues[CFG_REPAIR_ZONE_AMOUNT];

            g_PlayerRepairedBlock[id] = 0;
            cs_set_user_money(id, cs_get_user_money(id) - cost);

            if(g_TowerHealth + amount >  maxTowerHealth)
                g_TowerHealth  = maxTowerHealth;
            else
                g_TowerHealth  += amount;

            client_print_color(0, print_team_default, "%s^x01 Боец ^x03%s^x01 отремонтировал башню на ^x04%d HP^x01", CHAT_PREFIX, szName, amount);
        }
        else
        {
            set_hudmessage(0, 255, 0, 0.02, 0.86, 1, 1.0, 2.1, 0.2, 0.2, -1)
            ShowSyncHudMsg(id, g_SyncHudRepair, "Строительство %d блока завершено!", g_PlayerRepairedBlock[id]);
        }

        g_PlayerTimeInRepairZone[id] = g_ConfigValues[CFG_REPAIR_ZONE_TIME];
        set_task(2.0, "PlayerIsInRepairZone", id + TASK_IS_IN_REPAIR_ZONE)

        return;
    }

    if(g_TowerHealth >= maxTowerHealth)
    {
        set_hudmessage(255, 0, 0, 0.02, 0.86, 1, 1.0, 2.1, 0.2, 0.2, -1)
        ShowSyncHudMsg(id, g_SyncHudRepair, "Башня не повреждена");
    }
    else
    {
        set_hudmessage(255, 0, 0, 0.02, 0.84, 1, 1.0, 2.1, 0.2, 0.2, -1)
        ShowSyncHudMsg(id, g_SyncHudRepair, "Ожидай %d %s для ремонта блока %d/%d^nЦена за ремонт: %d$", playerTime, playerTime == 1 ? "сек" : "сек",  g_PlayerRepairedBlock[id]+1, maxBlocks, cost);

        g_PlayerTimeInRepairZone[id] --;
    }

    set_task(1.0, "PlayerIsInRepairZone", id + TASK_IS_IN_REPAIR_ZONE)
}

public _td_set_tower_health(iMode, iHealth, iExplode)
{
    if(iHealth > g_ConfigValues[CFG_TOWER_HEALTH] || iHealth <= 0 || (iMode != 0 && iMode != 1))
        return

    if(iMode == 1 && (g_TowerHealth + iHealth) > g_ConfigValues[CFG_TOWER_HEALTH] )
        return
    if(iMode == 0 && g_TowerHealth - iHealth < 0)
        return

    if(iMode == 1)
        g_TowerHealth += iHealth
    else if(iMode == 0)
        g_TowerHealth -= iHealth

    if(g_TowerHealth <= 0)
        EndGame(PLAYERS_LOSE)

    _td_update_tower_origin(iMode, float(iHealth), iExplode)
}
 

rxki

Пользователь
Регистрация
5 Янв 2019
Сообщения
148
Симпатии
2
Пол
Мужской
#2
Вот скриншоты целой башни и битой. При добавлении хп через ремонт она остается в таком же положении визуально, не поднимается обратно...
20190317131411_1.jpg 20190317123630_1.jpg
 

kapangaIII

Команда форума
Разработчик
Регистрация
31 Окт 2017
Сообщения
781
Симпатии
230
#3
Вызовов _td_set_tower_health нигде не видно.
 

rxki

Пользователь
Регистрация
5 Янв 2019
Сообщения
148
Симпатии
2
Пол
Мужской
#4
kapangaIII, действительно, хотел скопировать да забыл...вот он

PHP:
/* Mode 1 - add health | 0 - substract tower health */
public _td_set_tower_health(iMode, iHealth, iExplode)
{
    if(iHealth > g_ConfigValues[CFG_TOWER_HEALTH] || iHealth <= 0 || (iMode != 0 && iMode != 1))
        return

    if(iMode == 1 && (g_TowerHealth + iHealth) > g_ConfigValues[CFG_TOWER_HEALTH] )
        return
    if(iMode == 0 && g_TowerHealth - iHealth < 0)
        return

    if(iMode == 1)
        g_TowerHealth += iHealth
    else if(iMode == 0)
        g_TowerHealth -= iHealth

    if(g_TowerHealth <= 0)
        EndGame(PLAYERS_LOSE)

    _td_update_tower_origin(iMode, float(iHealth), iExplode)
}
 

rxki

Пользователь
Регистрация
5 Янв 2019
Сообщения
148
Симпатии
2
Пол
Мужской
#6
kapangaIII, перекурил малёх, уже понял, че сморозил
нашел упоминания только в нативе. больше этот паблик нигде не упоминается. ни в этом плагине, ни в каком другом...

register_native("td_set_tower_health", "_td_set_tower_health", 1);
 

kapangaIII

Команда форума
Разработчик
Регистрация
31 Окт 2017
Сообщения
781
Симпатии
230
#8
А натива где вызывается?
_td_update_tower_origin тоже где вызывается ещё?


Тебе нужно чтобы со строительством каждого блока она поднималась? Или в конце?
 

rxki

Пользователь
Регистрация
5 Янв 2019
Сообщения
148
Симпатии
2
Пол
Мужской
#9
kapangaIII, в том то и дело, что этот native и _td_update_tower_origin нигде не вызываются...

нужно что бы она в конце поднималась. когда игрок подчинил 2 блока и башне добавило жизни. Думаю, что после этого в PlayerIsInRepairZone

if(g_TowerHealth + amount > maxTowerHealth)
g_TowerHealth = maxTowerHealth;
else
g_TowerHealth += amount;
client_print_color(0, print_team_default, "%s^x01 Боец ^x03%s^x01 отремонтировал башню на ^x04%d HP^x01", CHAT_PREFIX, szName, amount);
18 Мар 2019
kapangaIII, Вот паблик, где еще вызывается _td_update_tower_origin. А с _td_set_tower_health нече не понятно. Нигде не упоминается...

PHP:
public MonsterChangeTrack(iMonster, track) {
    if(!IsMonster(iMonster))
        return HAM_IGNORED

    static szTouchedTrackName[33]
    static szTargetTrackName[33];
    new iTrack = entity_get_int(iMonster, EV_INT_monster_track)

    /* Get touched class name */
    entity_get_string(track, EV_SZ_targetname, szTouchedTrackName, 32)

    /* If monster target is other than -1 */
    if(iTrack != -1)
    {
        formatex(szTargetTrackName, charsmax(szTargetTrackName), "track%d_wall", iTrack)

        /* If Monster touched his next track_wall target */
        if(equali(szTouchedTrackName, szTargetTrackName))
        {
            formatex(szTargetTrackName, charsmax(szTargetTrackName), "track%d", ++iTrack)

            new iTarget = find_ent_by_tname(-1, szTargetTrackName)

            if(!iTarget)
            {
                iTarget = find_ent_by_tname(-1, "end")
                iTrack = -1;
            }

            /* Set target */
            entity_set_int(iMonster, EV_INT_monster_track, iTrack);
            entity_set_aim(iMonster, iTarget, Float:{0.0, 0.0, 0.0},0);

            /* Set speed if monster slow down */
            new Float:Velocity[3]
            velocity_by_aim(iMonster, entity_get_int(iMonster, EV_INT_monster_speed), Velocity)
            entity_set_vector(iMonster, EV_VEC_velocity, Velocity)
        }
    }
    /* If touched end_wall - humans don't kill monster */
    else if(equali(szTouchedTrackName, "end_wall"))
    {
        /* Check if monster is last */
        if(--g_AliveMonstersNum == 0 && g_SentMonstersNum == (IsSpecialWave(g_ActualWave) ? g_InfoAboutWave[g_ActualWave][WAVE_MONSTER_NUM] + 1 : g_InfoAboutWave[g_ActualWave][WAVE_MONSTER_NUM]))
            WaveEnded();

        new iDamage = entity_get_int(iMonster, EV_INT_monster_type) == ROUND_BOSS ?  g_ConfigValues[CFG_BOSS_DAMAGE] : g_ConfigValues[CFG_MONSTER_DAMAGE];

        g_TowerHealth -= iDamage

        if(g_TowerHealth <= 0)
        {
            g_TowerHealth = 0;
            EndGame(PLAYERS_LOSE);
        }
        else
[B]            _td_update_tower_origin(0, float(iDamage),  1)[/B]

        /* Remove Monster and healthbar */
        if(is_valid_ent(entity_get_edict(iMonster, EV_ENT_monster_healthbar)))
            remove_entity(entity_get_edict(iMonster, EV_ENT_monster_healthbar))

        if( entity_get_int(iMonster, EV_INT_monster_type) == ROUND_BONUS)
        {
            g_BonusRobbedMoney = 0;
            if(is_valid_ent( entity_get_edict(iMonster, EV_ENT_owner)) )
                remove_entity( entity_get_edict(iMonster, EV_ENT_owner) );
        }

        remove_entity(iMonster)

        if(g_IsTowerModelOnMap)
            TowerExplodeEffect()
    }
    return HAM_HANDLED
}
 

kapangaIII

Команда форума
Разработчик
Регистрация
31 Окт 2017
Сообщения
781
Симпатии
230
#10
Код написан по дибильски, попробуй так.
C-like:
else if((++g_PlayerRepairedBlock[id]) == maxBlocks || maxBlocks == 0)
        {
            new szName[33];
            get_user_name(id, szName, 32);

            set_hudmessage(0, 255, 0, 0.02, 0.86, 1, 1.0, 2.1, 0.2, 0.2, -1)
            ShowSyncHudMsg(id, g_SyncHudRepair, "Башня отремонтирована");

            static amount;
            if(!amount) amount = g_ConfigValues[CFG_REPAIR_ZONE_AMOUNT];

            g_PlayerRepairedBlock[id] = 0;
            cs_set_user_money(id, cs_get_user_money(id) - cost);

            if(g_TowerHealth + amount >  maxTowerHealth)
                g_TowerHealth  = maxTowerHealth;
            else
                g_TowerHealth  += amount;
            
            _td_update_tower_origin(1,amount,0);
            client_print_color(0, print_team_default, "%s^x01 Боец ^x03%s^x01 отремонтировал башню на ^x04%d HP^x01", CHAT_PREFIX, szName, amount);
        }
 

rxki

Пользователь
Регистрация
5 Янв 2019
Сообщения
148
Симпатии
2
Пол
Мужской
#11
kapangaIII, компилит, но с вот такой ошибкой

1552909360533.png
 

rxki

Пользователь
Регистрация
5 Янв 2019
Сообщения
148
Симпатии
2
Пол
Мужской
#13
kapangaIII, получилось. От души, бро, благодырь!

Закройте тему, пожалуйста.
 
Статус
Новые ответы в этой теме размещать нельзя.