Witamy w Nieoficjalnym polskim support'cie AMX Mod X
Witamy w Nieoficjalnym polskim support'cie AMX Mod X, jak w większości społeczności internetowych musisz się zarejestrować aby móc odpowiadać lub zakładać nowe tematy, ale nie bój się to jest prosty proces w którym wymagamy minimalnych informacji.
|
Server_frame
#1
Napisano 14.10.2013 21:24
Nowa wersja Tower Defense 0.2 Alpha | Inne Mody -> Nowości
#2
Napisano 15.10.2013 10:03
Think jest per gracz, jeśli nie chcesz wykonywać tego dla konkretnego gracza, think jest nie na miejscu.
set_task przy tak krótkich interwałach czasowych może się rozjeżdżać.
server_frame będzie się wykonywał częściej, w zależności od FPS serwera. Możesz tutaj zapisywać do zmiennej czas ostatniego wykonania w mikrosekundach i porównywać go. Taka metoda będzie chyba najbardziej optymalna. Użyj zmiennej static.
NIE pomagam na PW. Nie trudź się, na zlecenia nie odpiszę... Od pomagania jest forum.
NIE zaglądam w tematy wysłane na PW. Jeśli są na forum to prędzej czy później je przeczytam. Jeśli mam co w nich odpisać, to odpiszę.

#3
Napisano 15.10.2013 13:58
https://forums.alliedmods.net/showthread.php?t=162710i do tego
https://forums.alliedmods.net/showthread.php?t=43049Więc sądze, że do takich rzeczy jak napisalem w pierwszym poście lepszy jest server_frame, i tak własnie spróbuję zrobic, dzięki za pomoc, proszę o nie zamykanie tematu, gdyż chciałbym by wypowiedziały się jeszcze inne osoby.
Nowa wersja Tower Defense 0.2 Alpha | Inne Mody -> Nowości
#4
Napisano 20.10.2013 16:15
Think to Think, po to jest ten callback żeby można było ogarnąć zachowanie bytów w czasie i to jest najlepsze podejście w tym przypadku. Między wydajnością server_frame a think nie ma dużej różnicy, a decydując się na think zrobisz kod który nie tylko działa, ale i ma sens.
o set_task zapomnij, najmniejszy interwał to 0.1s (przynajmniej za 'moich czasów')
#5
Napisano 20.10.2013 17:39
Nowa wersja Tower Defense 0.2 Alpha | Inne Mody -> Nowości
#6
Napisano 20.10.2013 19:07
dobrze ustawiasz nextthink w callbacku? jeśli dasz gametime() + 0.01 to callback z Think dostaniesz najwcześniej jak się da, czyli właśnie przy następnym server_frame. Szybciej się nie da ![]()
Jeśli nawet wtedy masz problemy z płynnością, musisz usprawnić sposób w jaki reagujesz na bodźce. Z tym, że to już zależy od tego co robisz, jak nie powiesz nic więcej o swoim problemie to nikt Ci nie pomoże
bo i jak
#7
Napisano 21.10.2013 08:28
public thinkMonsterThink(iEnt) {
if(!is_valid_ent(iEnt))
return PLUGIN_CONTINUE
if(giMonsterAlive == 1 || giSendsMonster == 1)
goto rep
/* Przechodzeni przez potwory */
static entlist[3], szTrack[16]
new num = find_sphere_class(iEnt, "monster", 50.0, entlist, 2)
if(num <= 1)
goto rep;
new ciEnt = (entlist[1] == iEnt && entlist[0] != iEnt) ? entlist[0] : entlist[1]
if(ciEnt == iEnt)
goto rep
/* ========================= */
/* BugFix #1*/
if(pev(iEnt, pev_solid) == SOLID_NOT)
{
formatex(szTrack, 15, "track%d_wall", pev(iEnt, pev_monster_track))
new giEnt = find_ent_by_tname(-1, szTrack)
if(!is_valid_ent(giEnt))
giEnt = find_ent_by_tname(-1, "end_wall")
static Float:fOrigin[2][3]
pev(iEnt, pev_origin, fOrigin[0])
fm_get_brush_entity_origin(giEnt, fOrigin[1])
if(get_distance_f(fOrigin[0], fOrigin[1]) <= 80.0)
touchMonsterTrack(iEnt, giEnt)
}
/* ======== */
if(ciEnt != iEnt && ciEnt > 0)
{
entity_set_int(iEnt, EV_INT_solid, SOLID_NOT)
entity_set_float(iEnt, EV_FL_nextthink, get_gametime()+0.01);
return PLUGIN_CONTINUE
}
rep:
entity_set_int(iEnt, EV_INT_solid, SOLID_BBOX)
entity_set_float(iEnt, EV_FL_nextthink, get_gametime()+0.01);
return PLUGIN_CONTINUE
}
Problem, no problem taki, że ścina ent'y ( klatkuje ) na serwerze a na singlu płynnie... W Inne Mody -> Tower Defense jest tam demko, to tak jest na singlu. A to Touch ( Odpowiada za zmianę kierunku w którym ma się udać potwór
public touchMonsterTrack(monster, track)
{
if(!td_is_monster(monster) || !is_valid_ent(track))
return PLUGIN_CONTINUE;
new szClass[16], szFormat[33], iTrack;
pev(track, pev_targetname, szClass, 15)
iTrack = pev(monster, pev_monster_track);
formatex(szFormat, 32, "track%d_wall", iTrack)
if(equali(szFormat, szClass))
{
new Float:Velocity[3]
formatex(szFormat, 32, "track%d",iTrack+1)
new iTarget = find_ent_by_tname(-1, szFormat)
if(!is_valid_ent(iTarget))
iTarget = find_ent_by_tname(-1, "end")
entity_set_aim(monster, iTarget, Float:{0.0, 0.0, 0.0}, 0);
velocity_by_aim(monster, pev(monster, pev_monster_speed), Velocity)
entity_set_vector(monster, EV_VEC_velocity, Velocity)
set_pev(monster, pev_monster_track, iTrack+1);
}
else if(equali(szClass, "end_wall"))
{
//jeśli doszło do końca
giMonsterAlive--
set_pev(monster, pev_monster_track, 1)
new iTower
if(gModelTurret)
{
iTower = find_ent_by_class(-1, "tower");
if(!is_valid_ent(iTower)) {
remove_entity(monster)
return PLUGIN_CONTINUE
}
}
new Float:szMax = float( get_pcvar_num(gCvarInfo[CVAR_BASE_HEALTH]) )
new Float:fDamage;
new Float:fValue
fDamage = float( get_pcvar_num(gCvarInfo[CVAR_MONSTER_DAMAGE]))
if(e_RoundType:pev(monster, pev_monster_type) == ROUND_BOSS)
fDamage = float( get_pcvar_num(gCvarInfo[CVAR_BOSS_DAMAGE]))
giBaseHealth -= floatround(fDamage)
if(giBaseHealth <= 0) {
giBaseHealth = 0;
EndGame(PLAYERS_LOSE);
}
if(gModelTurret)
{
fValue = ( szMax / fDamage )
gfTowerOrigin[2] -= ( 225.0 / fValue )
Explode()
set_pev(iTower, pev_origin, gfTowerOrigin)
}
if(giMonsterAlive = is_special_wave(giWave)?gWaveInfo[giWave][WAVE_MONSTER_NUM]+1:gWaveInfo[giWave][WAVE_MONSTER_NUM])) {
client_cmd(0, "spk sound/%s", gSounds[SOUND_CLEAR_WAVE]);
set_task(3.0, "StartWave", 9123) // nowy wave
}
if(is_valid_ent(monster))
{
if(is_valid_ent(pev(monster, pev_monster_healthbar)))
remove_entity(pev(monster, pev_monster_healthbar))
set_pev(monster, pev_euser2, 0)
set_pev(monster, pev_monster_type, 0)
set_pev(monster, pev_monster_track, 0)
set_pev(monster, pev_monster_maxhealth, 0)
set_pev(monster, pev_monster_speed, 0)
set_pev(monster, pev_monster_healthbar, 0)
remove_entity(monster)
}
}
return PLUGIN_CONTINUE
}
I tylko w tych dwóch funkcjach są operacje na ent'ach. PS Wcześniej touch był też w thinku, jednak zeedytowałem mapę i kod tak, by wykonywał sie tylko przy dotknięciu. Ten BugFix w thinku, to symuluję toucha, gdyż gdy Potwór akurat przechodzi przez ent'a ( czyli ma SOLID_NOT ) nie może dotknąc niczego, tak więc musi sprawdzić odległość. Think jest wykonywany tylko dla BOSS'a albo BONUS'a ( na rundę może być albo to albo to ). (Gdyby ucieło kod to tu masz source:http://wklej.org/id/1154869/ http://wklej.org/id/1154871/)
Nowa wersja Tower Defense 0.2 Alpha | Inne Mody -> Nowości
#8
Napisano 21.10.2013 23:03
Ustawianie prędkości jest tylko na touchu?
#9
Napisano 22.10.2013 15:20
https://forums.alliedmods.net/showthread.php?p=2051524#post2051524
Nowa wersja Tower Defense 0.2 Alpha | Inne Mody -> Nowości
Użytkownicy przeglądający ten temat: 0
0 użytkowników, 0 gości, 0 anonimowych


Dodatki SourceMod













