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