Jump to content

pomoc Lokace


_viTo_

Recommended Posts

Zdravím,
Právě pracuji na lokaci ve které se hráč právě nachází. Mám vytvořený TextDraw ale netuším jaké funkce tam patří.
Mohu poprosit o Vaší pomoc ?
Děkuji. :)

 


#include <a_samp>

new Text:LokaceTD;

public OnFilterScriptInit()
{
	LokaceTD = TextDrawCreate(47.000000, 333.000000, "Las Venturas AirPort");
	TextDrawBackgroundColor(LokaceTD, 255);
	TextDrawFont(LokaceTD, 2);
	TextDrawLetterSize(LokaceTD, 0.160000, 0.699999);
	TextDrawColor(LokaceTD, -1);
	TextDrawSetOutline(LokaceTD, 1);
	TextDrawSetProportional(LokaceTD, 1);
	TextDrawSetSelectable(LokaceTD, 0);

	for(new i; i < MAX_PLAYERS; i ++)
	{
		if(IsPlayerConnected(i))
		{
			TextDrawShowForPlayer(i, LokaceTD);
		}
	}
	return 1;
}

public OnFilterScriptExit()
{
	TextDrawHideForAll(LokaceTD);
	TextDrawDestroy(LokaceTD);
	return 1;
}

public OnPlayerConnect(playerid)
{
	TextDrawShowForPlayer(playerid, LokaceTD);
	return 1;
}

 

Link to comment
Share on other sites

Problém ale je, že OnFilterScriptInit() se ti vyvolá pouze jakmile se spustí FS(jestliže je to během restartu serveru, tak to ani nebude nikdo během toho na serveru :kek: )...
To znamená, že nikomu dalšímu se ten textdraw nezobrazí. Takže, buď použí nějakou fci, která se často opakuje nebo se často stává, například OnPlayerUpdate... a nebo zkus použít můj nápad a vyvolat si jednosekundovou funkci, která se bude opakovat do skončení serveru:
 

new OSecTimer;

public OnFilterScriptInit() {
	OSecTimer = SetTimer("OnOneSecTimer", 1000, false);
	return 1;
}

public OnFilterScriptExit() {
	KillTimer(OSecTimer); // <--- !!!! 
	return 1;
}

forward OnOneSecTimer();
public OnOneSecTimer() {
	OSecTimer = SetTimer("OnOneSecTimer", 1000, false);
	return 1;
}

Pak je to už snadné. Protože probíhá každou vteřinu tak můžeš i všechno zjistit každou vteřinou:
 

forward OnOneSecTimer();
public OnOneSecTimer() {
	for(new i = 0, j = GetPlayerPoolSize(); i <= j; i++) {
		if (IsPlayerInRangeOfPoint(i, 5.0, x_pozice, y_pozice, z_pozice) {
			// Jestliže je někde v okolí:
			// (Rádius 5 je docela dost, i když se to nezdá)
			TextDrawShowForPlayer(i, LokaceTD);
		}
	}
	OSecTimer = SetTimer("OnOneSecTimer", 1000, false);
	return 1;
}

 

Edited by Scydo
  • Paráda! (+1) 1
Link to comment
Share on other sites

Ďalšia možnosť je použiť Streamer plugin, pomocou CreateDynamicRectangle vytvoriť zóny a používať callbacky OnPlayerEnterDynamicArea a OnPlayerLeaveDynamicArea.

Ak to urobíš takto, môžeš si do zóny uložiť aj nejaké dáta - napríklad index do poľa s názvami zón. Potom by si nemusel vždy prechádzať zoznam všetkých zón na to, aby si zistil, do ktorej zóny hráč vošiel a aký text mu máš zobraziť. Toto by si docielil pomocou Streamer_SetArrayData a Streamer_GetArrayData (array kvôli tomu, že okrem indexu názvu zóny budeš ukladať aj iné informácie - napríklad unikátne ID scriptu, aby sa ti to nebilo s inými scriptami).

Edited by DuFF
  • Líbí se mi to! (+1) 2
Link to comment
Share on other sites

Nejsem si teď momentálně jistý, ale myslím si že stačilo udělat do OnPlayerSpawn " TextDrawShowForPlayer(playerid, LokaceTD); " A myslím si že vyřešené, než aby se tady je*at s tímto. :D

 

Nějak takhle:

Citace

#include <a_samp>

new Text:LokaceTD;

public OnFilterScriptInit()
{
	LokaceTD = TextDrawCreate(47.000000, 333.000000, "Las Venturas AirPort");
	TextDrawBackgroundColor(LokaceTD, 255);
	TextDrawFont(LokaceTD, 2);
	TextDrawLetterSize(LokaceTD, 0.160000, 0.699999);
	TextDrawColor(LokaceTD, -1);
	TextDrawSetOutline(LokaceTD, 1);
	TextDrawSetProportional(LokaceTD, 1);
	TextDrawSetSelectable(LokaceTD, 0);

	for(new i; i < MAX_PLAYERS; i ++)
	{
		if(IsPlayerConnected(i))
		{
			TextDrawShowForPlayer(i, LokaceTD);
		}
	}
	return 1;
}

public OnPlayerSpawn(playerid)
{
      TextDrawShowForPlayer(playerid, LokaceTD);
      return 1;
}

public OnPlayerDisconnect(playerid)
{
      TextDrawHideForPlayer(playerid, LokaceTD);
      return 1;
}

A vyřešeno

Edited by shiftnity
  • Nope 3
Link to comment
Share on other sites

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now
×
×
  • Create New...