rxki
Пользователь
- Регистрация
- 5 Янв 2019
- Сообщения
- 208
- Симпатии
- 5
- Пол
- Мужской
Ребятки, помогите разобраться. В общем, в 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)
}