Skocz do zawartości

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.
  • Rozpoczynaj nowe tematy i odpowiedaj na inne
  • Zapisz się do tematów i for, aby otrzymywać automatyczne uaktualnienia
  • Dodawaj wydarzenia do kalendarza społecznościowego
  • Stwórz swój własny profil i zdobywaj nowych znajomych
  • Zdobywaj nowe doświadczenia

Dołączona grafika Dołączona grafika

Guest Message by DevFuse
 

Zdjęcie

Server_frame


  • Nie możesz napisać tematu
  • Zaloguj się, aby dodać odpowiedź
8 odpowiedzi w tym temacie

#1 GT Team

    Ten lepszy xD

  • Zbanowany

Reputacja: 321
Wszechpomocny

  • Postów:1 435
  • GG:
  • Imię:Tomasz i Grzegorz
  • Lokalizacja:Wojkowice
Offline

Napisano 14.10.2013 21:24

Czy do thinku, który wykonuje 30 entów i on wykonuje się co 0.01, lepszy jest server_frame(), set_task, czy think ?

Nowa wersja Tower Defense 0.2 Alpha | Inne Mody -> Nowości

 


#2 GwynBleidD

    Godlike

  • Przyjaciel

Reputacja: 1 869
Godlike

  • Postów:3 066
  • Steam:steam
  • Lokalizacja:Przemyśl
Offline

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.


  • +
  • -
  • 2

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ę.
 
1988650.png?theme=dark


#3 GT Team

    Ten lepszy xD

  • Autor tematu
  • Zbanowany

Reputacja: 321
Wszechpomocny

  • Postów:1 435
  • GG:
  • Imię:Tomasz i Grzegorz
  • Lokalizacja:Wojkowice
Offline

Napisano 15.10.2013 13:58

Chcąć nie chcąć, zaszedłem do:
https://forums.alliedmods.net/showthread.php?t=162710
i do tego
https://forums.alliedmods.net/showthread.php?t=43049
Wię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 R3X

    Godlike

  • Przyjaciel

Reputacja: 2 987
Godlike

  • Postów:4 248
  • Lokalizacja:Nie
Offline

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') 


  • +
  • -
  • 4

#5 GT Team

    Ten lepszy xD

  • Autor tematu
  • Zbanowany

Reputacja: 321
Wszechpomocny

  • Postów:1 435
  • GG:
  • Imię:Tomasz i Grzegorz
  • Lokalizacja:Wojkowice
Offline

Napisano 20.10.2013 17:39

Wlasnie z ich zachowaniem jest problem. Na new game enty poruszaja sie bardzo gladko. A a na serwerze poruszaja sie lecz ze scinkami. Uzywam velocity by aim by poruszyc enty (bo inmego sposobu nie znam) w jednej funkcji. A w thiniu mam "zlozone" sprawdzanie odleglosfiodległości.

Nowa wersja Tower Defense 0.2 Alpha | Inne Mody -> Nowości

 


#6 R3X

    Godlike

  • Przyjaciel

Reputacja: 2 987
Godlike

  • Postów:4 248
  • Lokalizacja:Nie
Offline

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 ;P bo i jak

 

 


  • +
  • -
  • 0

#7 GT Team

    Ten lepszy xD

  • Autor tematu
  • Zbanowany

Reputacja: 321
Wszechpomocny

  • Postów:1 435
  • GG:
  • Imię:Tomasz i Grzegorz
  • Lokalizacja:Wojkowice
Offline

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 R3X

    Godlike

  • Przyjaciel

Reputacja: 2 987
Godlike

  • Postów:4 248
  • Lokalizacja:Nie
Offline

Napisano 21.10.2013 23:03

Ustawianie prędkości jest tylko na touchu?


  • +
  • -
  • 0

#9 GT Team

    Ten lepszy xD

  • Autor tematu
  • Zbanowany

Reputacja: 321
Wszechpomocny

  • Postów:1 435
  • GG:
  • Imię:Tomasz i Grzegorz
  • Lokalizacja:Wojkowice
Offline

Napisano 22.10.2013 15:20

Tak, a w thinku jest "Symulowanie" go dotknięcia przez specjalnego gdy jest on SOLID_NOT. Chodzi o to, że ent'y nie są płynnie poruszane na serwerze. Założyłem również temat na alliedmodders, możesz go śledzić tutaj
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