Beiträge von Alf21

    Stand auf dem Schlauch, habs jetzt verstanden, dachte immer die MAX_PLAYERS Variable ist über die Server.cfg bei den maximalen Spielern deklariert und bekommt diese auch daher ^^
    Danke für die Hilfe, jetzt durchschau ich, dachte halt dass es da noch ieine Funktion gibt, die man nutzen sollte, damit es besser läuft/dynamisch und keine Unstimmigkeiten auftreten, hatte da iwie sowas in ner Impl. Datei von Shoebill auf GitHub gesehen und dachtes deshalb :D
    Glaube das war das:

    Code
    varKiller[SampObjectStoreImpl.MAX_PLAYERS];


    Mein neuer Code, klappt alles:

    Code
    public static final int MAX_PLAYERS = 500;
    private Player[] varKiller = new Player[MAX_PLAYERS];


    Thx, MfG Alf21


    --------------
    Logan:


    Ich verstehe nicht ganz was du mit vererben lassen meinst... Das hatte ich ja eig. mit den Strings / Player Variablen vor. Dass ich diese zu jedem Spieler setze und über die PlayerID abfrage, also sozusagen einer Variablen vererben.

    Ja, ich weiß ja wie das mit den Arrays funktioniert, trotzdem danke für deine Antwort, hab da ne kürzere Funktion gefunden :D
    Aber mein Hauptproblem ist, wo ich den Wert 'MAX_PLAYERS' aus PAWN bzw. aus der server.cfg dynamisch interpretiert herbekomme...


    In PAWN nimmt er ja dann den Wert der maximalen Spieler, sagen wir 50. Ich wollte das in Java nun auch dynamisch machen, dh. auch so etwas wie MAX_PLAYERS herbekommen, was ja eig. auch nur eine Variable für einen Wert ist.


    Also kurz: Wo bekomme ich die MAX_PLAYERS in Java her (Funktion?) ? :D

    Diesmal zu den Variablen... Wie ist das hier mit den auf die Spieler basierenden Variablen geregelt? Gibt es da iwas bestimmtes?


    Bsp.: In PAWN war es wie folgt:

    //Für "auf Spieler basierende" Variablen/Arrays zum definieren
    new variable[MAX_PLAYERS];
    ...


    //Für "auf Spieler basierende" Variablen/Arrayteile setzt man diese dann später:
    variable[playerid] = 0;
    ...


    Funktioniert das mit den Arrays auch so einfach in Shoebill? Falls ja, könnte mir wer ein Beispiel bringen :)
    Wahrscheinlich stelle ich mich doofer an als es ist, habe jetzt, da ich keine Lösung selbst gefunden habe nen String gebaut, der 2 Spieler zusammenfasst, den gesplittet und abgefragt ob der eigene Namen enthalten ist, damit man den 2.Spieler (Killer) zu einer anderen Funktion mit übergeben kann, da das Problem da liegt, dass die Variablen in dem Sinne ja 'immer' Global sind, da wenn man 2Spieler auf dem Server hat, beide das Script nutzen und die Variablen gegenseitig überschreiben...
    Also wo bekomme ich die MAX_PLAYERS 'dynamisch' her?


    Danke :)

    123marvin123:


    Vielen DANK!!! SO einfach es dann doch klingt wäre ich wahrscheinlich nie drauf gekommen :D
    Denn ich dachte ich habe es die Zeilen drüber schon gemacht, dabei war es nicht so sondern nur mit dem Geld setzten... hätte auch nen 'else if' machen können, aber naja nicht bemerkt und davon ausgegangen dass es so ist... Danke, alles läuft super, eig wie vorher, nur ohne 100te Fehlermeldungen :)))

    Der Fehler lag wieder einmal da, wo man ihn nicht erwartet... - in einer ganz anderen Datei, welche an sich eig. nicht viel mit den Commands zu tun hat...


    Erläuterung: Durch den Befehl /kill hat man jemanden getötet - sich selbst.
    In dem PlayerManager also registerHandler gibt es eine Kategorie PlayerDeathEvent. Dort war beschrieben, dass er dann auch ein Textdraw erstellen soll.
    Wahrscheinlich haben sich beide überlappt. :/ Was zu dem Fehler geführt haben könnte, nun werde ich mal schauen, wie ich das fixen kann, also wenn man sich selbst tötet, dass man keine Errors bekommt. Dennoch komisch, das gleiche müsste theoretisch passieren, wenn man nen Doublekill hat oder sich und jmd. anderes tötet... Kanns leider nicht testen :D


    Fehler gefunden anhand sehr dokumentierter Logdatei xD


    Ob ich nun beide Fehler gelöst habe oder nur das überschreiben werde ich morgen bescheid geben... Dann brauche ich vllt doch noch Hilfe, denn dann würde ich den Faden ganz verlieren :D


    Im Anhang befindet sich die alte Logdatei (mit Fehlerauflistung), falls es doch nicht der gesamte Fehler war ^^


    -----------------------
    >> edit:


    Nun klappt alles, ohne iwelches flackern, jedoch taucht nun nur noch ein Fehler einmal auf (immerhin nicht 20x ^^):

    Code
    java.lang.NullPointerException	at com.samp.lvdm.PlayerManager.lambda$new$6(Unknown Source)	at com.samp.lvdm.PlayerManager$$Lambda$57/32904911.handleEvent(Unknown Source)	at net.gtaun.util.event.EventManagerRoot.dispatchEvent(EventManagerRoot.java:189)	at net.gtaun.util.event.EventManager.dispatchEvent(EventManager.java:129)	at net.gtaun.shoebill.SampEventDispatcher.onPlayerDeath(SampEventDispatcher.java:218)	at net.gtaun.shoebill.samp.SampCallbackManagerImpl$1.lambda$onPlayerDeath$8(SampCallbackManagerImpl.java:121)	at net.gtaun.shoebill.samp.SampCallbackManagerImpl$1$$Lambda$78/20930634.call(Unknown Source)	at net.gtaun.shoebill.util.TryUtils.tryTo(TryUtils.java:21)	at net.gtaun.shoebill.util.TryUtils.tryTo(TryUtils.java:14)	at net.gtaun.shoebill.samp.SampCallbackManagerImpl$1.onPlayerDeath(SampCallbackManagerImpl.java:121)


    Source (PlayerManager.java):

    Java
    package com.samp.lvdm;import java.util.Random;import net.gtaun.shoebill.common.command.CommandGroup;import net.gtaun.shoebill.common.command.PlayerCommandManager;import net.gtaun.shoebill.constant.WeaponModel;import net.gtaun.shoebill.data.Color;import net.gtaun.shoebill.data.Vector3D;import net.gtaun.shoebill.event.player.PlayerCommandEvent;import net.gtaun.shoebill.event.player.PlayerConnectEvent;import net.gtaun.shoebill.event.player.PlayerDeathEvent;import net.gtaun.shoebill.event.player.PlayerDisconnectEvent;import net.gtaun.shoebill.event.player.PlayerRequestClassEvent;import net.gtaun.shoebill.event.player.PlayerSpawnEvent;import net.gtaun.shoebill.event.player.PlayerUpdateEvent;import net.gtaun.shoebill.event.player.PlayerWeaponShotEvent;import net.gtaun.shoebill.object.Player;import net.gtaun.util.event.EventManager;import net.gtaun.util.event.EventManagerNode;import net.gtaun.util.event.HandlerPriority;public class PlayerManager{	private static final int INITIAL_MONEY = 50000;	private static final Vector3D[] RANDOM_SPAWNS =	{		new Vector3D(1958.3783f, 1343.1572f, 15.3746f),		new Vector3D(2199.6531f, 1393.3678f, 10.8203f),		new Vector3D(2483.5977f, 1222.0825f, 10.8203f),		new Vector3D(2637.2712f, 1129.2743f, 11.1797f),		new Vector3D(2000.0106f, 1521.1111f, 17.0625f),		new Vector3D(2024.8190f, 1917.9425f, 12.3386f),		new Vector3D(2261.9048f, 2035.9547f, 10.8203f),		new Vector3D(2262.0986f, 2398.6572f, 10.8203f),		new Vector3D(2244.2566f, 2523.7280f, 10.8203f),		new Vector3D(2335.3228f, 2786.4478f, 10.8203f),		new Vector3D(2150.0186f, 2734.2297f, 11.1763f),		new Vector3D(2158.0811f, 2797.5488f, 10.8203f),		new Vector3D(1969.8301f, 2722.8564f, 10.8203f),		new Vector3D(1652.0555f, 2709.4072f, 10.8265f),		new Vector3D(1564.0052f, 2756.9463f, 10.8203f),		new Vector3D(1271.5452f, 2554.0227f, 10.8203f),		new Vector3D(1441.5894f, 2567.9099f, 10.8203f),		new Vector3D(1480.6473f, 2213.5718f, 11.0234f),		new Vector3D(1400.5906f, 2225.6960f, 11.0234f),		new Vector3D(1598.8419f, 2221.5676f, 11.0625f),		new Vector3D(1318.7759f, 1251.3580f, 10.8203f),		new Vector3D(1558.0731f, 1007.8292f, 10.8125f),		new Vector3D(-857.0551f, 1536.6832f, 22.5870f),		new Vector3D(817.3494f, 856.5039f, 12.7891f),		new Vector3D(116.9315f, 1110.1823f, 13.6094f),		new Vector3D(-18.8529f, 1176.0159f, 19.5634f),		new Vector3D(-315.0575f, 1774.0636f, 43.6406f),		new Vector3D(1705.2347f, 1025.6808f, 10.8203f)	};	private EventManagerNode eventManagerNode;	private PlayerCommandManager commandManager;	private Random random;	public PlayerManager(EventManager rootEventManager)	{		random = new Random();		eventManagerNode = rootEventManager.createChildNode();		commandManager = new PlayerCommandManager(eventManagerNode);		commandManager.installCommandHandler(HandlerPriority.NORMAL);		commandManager.registerCommands(new LvdmCommands());		commandManager.registerCommands(new TestCommands());		commandManager.registerCommands(new AdminCommands()); 		// Example: register /test [command] ...		CommandGroup testGroup = new CommandGroup();		testGroup.registerCommands(new TestCommands());		commandManager.registerChildGroup(testGroup, "test");		// Example: register /admin [command] ...		CommandGroup adminCommands = new CommandGroup(); 		adminCommands.registerCommands(new AdminCommands()); 		commandManager.registerChildGroup(adminCommands, "admin");		commandManager.setUsageMessageSupplier((player, command, prefix, params, help) -> {             String message = prefix + command;             for (String param : params) {                 message += " [" + param + "]";             }             return message;         }); 	//--		eventManagerNode.registerHandler(PlayerUpdateEvent.class, (e) ->		{			Player player = e.getPlayer(); 			// getUpdateCount() Example			if (player.getUpdateCount() % 100 == 0)			{				player.setScore(player.getMoney());			}		});		eventManagerNode.registerHandler(PlayerWeaponShotEvent.class, (e) ->		{		//	e.getPlayer().sendMessage(Color.LIGHTBLUE, String.format("WeaponShot: hittype: %1$s, weapon: %2$s, pos: %3$s", e.getHitType(), e.getWeapon(), e.getPosition()));		});		eventManagerNode.registerHandler(PlayerConnectEvent.class, (e) ->		{			Player player = e.getPlayer();			player.sendGameText(5000, 5, "~w~SA-MP: ~r~Las Venturas ~g~MoneyGrub");			Player.sendMessageToAll(Color.GREEN,player.getName()+" Connected!");			player.sendMessage(Color.PURPLE, "Welcome to Las Venturas MoneyGrub, For help type /help.");			Player.sendDeathMessageToAll(player, null, WeaponModel.CONNECT);			Color color = new Color();			do color.setValue(random.nextInt()); while (color.getY() < 128);			player.setColor(color);		});		eventManagerNode.registerHandler(PlayerDisconnectEvent.class, (e) ->		{			Player player = e.getPlayer();			Player.sendMessageToAll(Color.RED,player.getName()+" Disconnected!");			Player.sendDeathMessageToAll(player, null, WeaponModel.DISCONNECT);		});		eventManagerNode.registerHandler(PlayerSpawnEvent.class, (e) ->		{			Player player = e.getPlayer();			player.giveMoney(INITIAL_MONEY);			player.toggleClock(true);			setRandomSpawnPos(player);		});		eventManagerNode.registerHandler(PlayerDeathEvent.class, (e) ->		{			Player player = e.getPlayer();			Player killer = e.getKiller();			player.setMoney(0);						Player.sendDeathMessageToAll(killer, player, e.getReason());			if (killer != null) {				killer.giveMoney(player.getMoney());			}			if(killer.getName() != player.getName()) {				LvdmGamemode.queue.addPoints(killer, "GEGNER ELIMINIERT", 100, DynamicActionLabel.DynamicItem.TYPE_BIG);			}/* else {				LvdmGamemode.queue.addPoints(player, "SELBSTMORD", -100, DynamicActionLabel.DynamicItem.TYPE_BIG);			}*/		});		eventManagerNode.registerHandler(PlayerRequestClassEvent.class, (e) ->		{			Player player = e.getPlayer();			setupForClassSelection(player);		});		eventManagerNode.registerHandler(PlayerCommandEvent.class, HandlerPriority.BOTTOM, (e) ->		{			Player player = e.getPlayer();			player.sendMessage(Color.RED, "Unknown command. Type /help to see help.");			e.setProcessed();		});	}	public void uninitialize()	{		commandManager.destroy();		eventManagerNode.destroy();	}	private void setRandomSpawnPos(Player player)	{		int rand = random.nextInt(RANDOM_SPAWNS.length);		player.setLocation(RANDOM_SPAWNS[rand]);		player.setInterior(0);	}	private void setupForClassSelection(Player player)	{		player.setInterior(14);		player.setLocation(258.4893f, -41.4008f, 1002.0234f);		player.setAngle(270.0f);		player.setCameraPosition(256.0815f, -43.0475f, 1004.0234f);		player.setCameraLookAt(258.4893f, -41.4008f, 1002.0234f);	}}


    MfG Alf21!

    123marvin123:


    Danke für die schnelle Antwort :thumbup:


    Alles klar, ich werde es probieren, aber jetzt erscheint es für mich merkwürdig, warum die Fehlermeldung erst erscheint, wenn bereits eine vorhanden war, also wenn man 2 Textdraws aufruft oder sich die Blickposition (beim Tod) ändert... Sobald ich einen Textdraw nur einmal aufrufe, also nur einer sichtbar ist, erscheinen keine Fehler...


    Ich werde mich mal durchknobeln und es versuchen zu verstehen, bis dahin noch einen guten 1.Weihnachtstags-Abend :D


    ---------------------
    >> edit:
    - Okay, entweder ich habe die Hilfestellung nicht verstanden und das noch schlimmer gemacht oder sie war falsch - was ich nicht glaube :D
    - Es funktioniert ja alles, dennoch werden viele Fehler angezeigt, nun ja und jetzt aufeinmal 5 mehr, der Textdraw flackert jetzt beim erstellen aber funktioniert sonst von der Bedienungsoberfläche alles... Ich finds merkwürdig, könnte mir wer helfen? Ich blick nicht durch... :/


    Der Fehlercode (Habe mir alle wichtigen Daten von der Konsole ausgeben lassen, ist ja kein Meisterwerk :D)
    >> Datei: siehe Anhang (output.txt)


    ---------------------


    Und die Veränderte Datei... ist wahrscheinlich falsch was ich gemacht habe, sind ja auch 5 Fehler mehr, dennoch ist es das einzige was mit der Hilfestellung koorperiert.
    Ansonsten crashed der gesamte Server...

    Java
    /** folgende Sachen wurden verändert:* * updateComboScore()* createTextDraw()* Textdraw - Variable nun GLOBAL deklariert*/package com.samp.lvdm;import java.util.ArrayList;import java.util.Iterator;import java.util.List;import net.gtaun.shoebill.Shoebill;import net.gtaun.shoebill.ShoebillConfig;import net.gtaun.shoebill.ShoebillLauncher;import net.gtaun.shoebill.constant.TextDrawAlign;import net.gtaun.shoebill.exception.CreationFailedException;import net.gtaun.shoebill.object.Player;import net.gtaun.shoebill.object.PlayerTextdraw;import net.gtaun.shoebill.object.Textdraw;public class DynamicActionLabel extends Thread {	public boolean allowNegativePoints = false;	private ArrayList<DynamicItem> items = new ArrayList<DynamicItem>();	private int mPoints = 0;	private boolean combo = false;	private PlayerTextdraw mComboTextbase = null;	private Player mPlayer;	public DynamicActionLabel() { }	public class DynamicItem {		public static final int TYPE_BIG = 1;		public static final int TYPE_SMALL = 2;		private int mYPosition = 0;		private String mText;		private Player mPlayer;		private PlayerTextdraw mVisibleTextdraw;		private boolean mRemovable = false;		private boolean mPending = true;		private long mTimestamp;		private int mType;//-- Textdraw nun oben definiert...		PlayerTextdraw textdraw = null;		public void setPending(boolean pStatus) {			mPending = pStatus;		}		public boolean isActive() {			return ((mTimestamp + 6) < (System.currentTimeMillis() / 1000l)) ? false : true;		}		public boolean isPending() {			return mPending;		}		public boolean isRemovable() {			return mRemovable;		}		public int getYPosition() {			return mYPosition;		}		public String getText() {			return mText;		}		public void setText(String pText) {			mText = pText;		}		public DynamicItem(Player pPlayer, String pText, int pType) {			this.mText = pText;			this.mPlayer = pPlayer;			this.mVisibleTextdraw = createTextDraw(mText, 0, 0);			this.mTimestamp = (System.currentTimeMillis() / 1000l);			this.mType = pType;		}/*             //-- Alte Version		public PlayerTextdraw createTextDraw(String pText, int x, int y) {			try {				textdraw = PlayerTextdraw.create(mPlayer, 400+x, 310+y);				textdraw.setText(pText);				textdraw.setAlignment(TextDrawAlign.RIGHT);				if(mType == TYPE_SMALL) {					textdraw.setLetterSize(0.135f*3, 0.135f*6);				}				else if(mType == TYPE_BIG) {					textdraw.setLetterSize(0.135f*4, 0.135f*8);				}			}			catch(CreationFailedException e) {				//Server.get().sendMessageToAll(Color.RED, "ERROR:"+y);				e.printStackTrace();			}			return textdraw;		}*/		public PlayerTextdraw createTextDraw(String pText, int x, int y) {			try {				Shoebill.get().runOnSampThread(() -> {					textdraw = PlayerTextdraw.create(mPlayer, 400+x, 310+y);					textdraw.setText(pText);					textdraw.setAlignment(TextDrawAlign.RIGHT);					if(mType == TYPE_SMALL) {						textdraw.setLetterSize(0.135f*3, 0.135f*6);					}					else if(mType == TYPE_BIG) {						textdraw.setLetterSize(0.135f*4, 0.135f*8);					}				});			}			catch(CreationFailedException e) {				//Server.get().sendMessageToAll(Color.RED, "ERROR:"+y);				e.printStackTrace();			}			return textdraw;		}		public void setCurrentTextdraw(PlayerTextdraw pTextdraw) {			mVisibleTextdraw = pTextdraw;		}		public void moveDown() {			mYPosition++;			if(mYPosition > 100) {				mRemovable = true;			}			else {				PlayerTextdraw newTextdraw = createTextDraw(mText, 0, mYPosition);				hide();				setCurrentTextdraw(newTextdraw);				display();			}		}		public void display() {			if(mVisibleTextdraw != null)				mVisibleTextdraw.show();		}		public void hide() {			if(mVisibleTextdraw != null) {				mVisibleTextdraw.hide();					mVisibleTextdraw.destroy();			}		}	}	public void run() {		while(!interrupted()) {			//Server.get().sendMessageToAll(Color.BLUE, "Thread:"+Thread.currentThread().getName());			checkItemDuration();			if((mComboTextbase == null && mPlayer != null) || (mPlayer != null && !mComboTextbase.getText().equals(String.valueOf(mPoints))))				updateComboScore(mPlayer);			try {				List<DynamicItem> newList = new ArrayList<DynamicItem>(items);				Iterator<DynamicItem> it = newList.iterator();				while(it.hasNext()) {					DynamicItem item = it.next();					if(item.isPending()) {						moveItemsDown();						// show pending item						fadeItemIn(item);						// unset pending status						item.setPending(false);					}				}				Thread.sleep(200);			}			catch(Exception e) {				LvdmGamemode.logger().error("Error in DynamicActionLabel \n" + e.getMessage());				e.printStackTrace();			}		}	}	private void fadeItemIn(DynamicItem item) {		for(int i=0;i<=item.getText().length();i++) {			PlayerTextdraw newTextdraw = item.createTextDraw(item.getText().substring(0, i), -10, 0);			item.hide();			item.setCurrentTextdraw(newTextdraw);			item.display();			try {				Thread.sleep(10);			} catch (InterruptedException e) {				// TODO Auto-generated catch block				e.printStackTrace();			}		}		if(mPlayer != null)			mPlayer.playSound(1131);		for(int i=0;i<=10;i++) {			PlayerTextdraw newTextdraw = item.createTextDraw(item.getText(), i-10, 0);			item.hide();			item.setCurrentTextdraw(newTextdraw);			item.display();			try {				Thread.sleep(20);			} catch (InterruptedException e) {				// TODO Auto-generated catch block				e.printStackTrace();			}		}	}	private void checkItemDuration() {		try {			Iterator<DynamicItem> it = items.iterator();			while(it.hasNext()) {				DynamicItem item = it.next();				if(!item.isActive()) {					//Server.get().sendMessageToAll(Color.RED, "Removing item based on timestamp!");					// custom hide animation					for(int i=0;i<=item.getText().length();i++) {						PlayerTextdraw newTextdraw = item.createTextDraw(item.getText().substring(0, item.getText().length()-i), 0, item.getYPosition());						item.hide();						item.setCurrentTextdraw(newTextdraw);						item.display();						try {							Thread.sleep(10);						} catch (InterruptedException e) {							// TODO Auto-generated catch block							e.printStackTrace();							System.out.print(e);							System.out.println("");						}					}					item.hide();						it.remove();				}			}		}		catch(Exception e) {			// TODO fix ConcurrentModificationException		}		//remove if necessary		if(items.size() == 0) {			combo = false;			//Server.get().sendMessageToAll(Color.BLUE, "COMBO:FALSE ("+items.size()+") ");			mPoints = 0;			if(mComboTextbase != null)				removeComboScore();		}	}	private void moveItemsDown() {		for(int i=0;i<18;i++) {			Iterator<DynamicItem> it = items.iterator();			while(it.hasNext()) {				DynamicItem item = it.next();				if(!item.isPending())					item.moveDown();				if(item.isRemovable()) {					if(items.contains(item)) {						item.hide();						it.remove();						//Server.get().sendMessageToAll(Color.RED, "REMOVE:"+items.size());					}				}			}			try {				Thread.sleep(30);			} catch (InterruptedException e) { 				e.printStackTrace();			}		} 	}	private void add(Player pPlayer, String text, int type) {		DynamicItem item = new DynamicItem(pPlayer, text, type);		items.add(item);	}	public void addPoints(Player pPlayer, String reason, int amount, int type) {		this.mPlayer = pPlayer;	// TODO INSECURE!!! Solve one queue per player in constructor!!!		//Addition by Alf21		if(!allowNegativePoints)		{			if(this.mPoints + amount < 0) { //Test auf negativen Wert				this.mPoints = 0;			} else {				this.mPoints += amount; 			}		} else {			this.mPoints += amount;		}		//end		add(pPlayer, reason+" "+amount, type);		//check if combo mode		if(items.size() > 1) {			combo = true;			//Server.get().sendMessageToAll(Color.BLUE, "COMBO:TRUE ("+items.size()+")");			if(mComboTextbase != null)				removeComboScore();		}	}/*     //-- Alte Version	private void updateComboScore(Player pPlayer) {		if(mPoints == 0 || items.size() <= 1)			return;		String score = String.valueOf(mPoints);		mComboTextbase = PlayerTextdraw.create(pPlayer, 425, 310);		for(int i=0;i<=score.length();i++) {			mComboTextbase.setText(score.substring(0, i));			mComboTextbase.show();			try {				Thread.sleep(50);			} catch (InterruptedException e) {				// TODO Auto-generated catch block				e.printStackTrace();			}		}	}*/	private void updateComboScore(Player pPlayer) {		if(mPoints == 0 || items.size() <= 1)			return;		Shoebill.get().runOnSampThread(() -> {			String score = String.valueOf(mPoints);			mComboTextbase = PlayerTextdraw.create(pPlayer, 425, 310);			for(int i=0;i<=score.length();i++) {				mComboTextbase.setText(score.substring(0, i));				mComboTextbase.show();				try {					Thread.sleep(50);				} catch (InterruptedException e) {					// TODO Auto-generated catch block					e.printStackTrace();				}			}		});	}	private void removeComboScore() {		mComboTextbase.setText(" ");		mComboTextbase.hide();		mComboTextbase.destroy();	}}

    Dachte ich mir ^^


    2 Beispiele

    Code
    // 2 Beispiele:	@Command	@CommandHelp("Heal yourself")	public boolean heal(Player p, String params)	{		LvdmGamemode.queue.addPoints(p, "Geheilt auf " + Double.parseDouble(params) + " Leben", -100, DynamicActionLabel.DynamicItem.TYPE_SMALL);		p.setHealth(Float.parseFloat(params));		return true;	}	@Command	@CommandHelp("Kill yourself")	public boolean kill(Player p)	{		LvdmGamemode.queue.addPoints(p, "Selbstmord", -100, DynamicActionLabel.DynamicItem.TYPE_SMALL);		p.setHealth(0.0f);		return true;	}


    Und die DynamicActionLabel.java Datei vom LVDM Script, hoffe ich kann sie so posten... (Wurde bei addPoints leicht verändert, mache das dynamisch einstellbar - nichts besonderes ... und dürfte die Fehler auch nicht hervorrufen, getestet..)

    Java
    package com.samp.lvdm;import java.util.ArrayList;import java.util.Iterator;import java.util.List;import net.gtaun.shoebill.constant.TextDrawAlign;import net.gtaun.shoebill.exception.CreationFailedException;import net.gtaun.shoebill.object.Player;import net.gtaun.shoebill.object.PlayerTextdraw;public class DynamicActionLabel extends Thread {	public boolean allowNegativePoints = false;	private ArrayList<DynamicItem> items = new ArrayList<DynamicItem>();	private int mPoints = 0;	private boolean combo = false;	private PlayerTextdraw mComboTextbase = null;	private Player mPlayer;	public DynamicActionLabel() { }	public class DynamicItem {		public static final int TYPE_BIG = 1;		public static final int TYPE_SMALL = 2;		private int mYPosition = 0;		private String mText;		private Player mPlayer;		private PlayerTextdraw mVisibleTextdraw;		private boolean mRemovable = false;		private boolean mPending = true;		private long mTimestamp;		private int mType;		public void setPending(boolean pStatus) {			mPending = pStatus;		}		public boolean isActive() {			return ((mTimestamp + 6) < (System.currentTimeMillis() / 1000l)) ? false : true;		}		public boolean isPending() {			return mPending;		}		public boolean isRemovable() {			return mRemovable;		}		public int getYPosition() {			return mYPosition;		}		public String getText() {			return mText;		}		public void setText(String pText) {			mText = pText;		}		public DynamicItem(Player pPlayer, String pText, int pType) {			this.mText = pText;			this.mPlayer = pPlayer;			this.mVisibleTextdraw = createTextDraw(mText, 0, 0);			this.mTimestamp = (System.currentTimeMillis() / 1000l);			this.mType = pType;		}		public PlayerTextdraw createTextDraw(String pText, int x, int y) {			PlayerTextdraw textdraw = null;			try {				textdraw = PlayerTextdraw.create(mPlayer, 400+x, 310+y);				textdraw.setText(pText);				textdraw.setAlignment(TextDrawAlign.RIGHT);				if(mType == TYPE_SMALL) {					textdraw.setLetterSize(0.135f*3, 0.135f*6);				}				else if(mType == TYPE_BIG) {					textdraw.setLetterSize(0.135f*4, 0.135f*8);				}			}			catch(CreationFailedException e) {				//Server.get().sendMessageToAll(Color.RED, "ERROR:"+y);				e.printStackTrace();			}			return textdraw;		}		public void setCurrentTextdraw(PlayerTextdraw pTextdraw) {			mVisibleTextdraw = pTextdraw;		}		public void moveDown() {			mYPosition++;			if(mYPosition > 100) {				mRemovable = true;			}			else {				PlayerTextdraw newTextdraw = createTextDraw(mText, 0, mYPosition);				hide();				setCurrentTextdraw(newTextdraw);				display();			}		}		public void display() {			if(mVisibleTextdraw != null)				mVisibleTextdraw.show();		}		public void hide() {			if(mVisibleTextdraw != null) {				mVisibleTextdraw.hide();					mVisibleTextdraw.destroy();			}		}	}	public void run() {		while(!interrupted()) {			//Server.get().sendMessageToAll(Color.BLUE, "Thread:"+Thread.currentThread().getName());			checkItemDuration();			if((mComboTextbase == null && mPlayer != null) || (mPlayer != null && !mComboTextbase.getText().equals(String.valueOf(mPoints))))				updateComboScore(mPlayer);			try {				List<DynamicItem> newList = new ArrayList<DynamicItem>(items);				Iterator<DynamicItem> it = newList.iterator();				while(it.hasNext()) {					DynamicItem item = it.next();					if(item.isPending()) {						moveItemsDown();						// show pending item						fadeItemIn(item);						// unset pending status						item.setPending(false);					}				}				Thread.sleep(200);			}			catch(Exception e) {				LvdmGamemode.logger().error("Error in DynamicActionLabel \n" + e.getMessage());				e.printStackTrace();			}		}	}	private void fadeItemIn(DynamicItem item) {		for(int i=0;i<=item.getText().length();i++) {			PlayerTextdraw newTextdraw = item.createTextDraw(item.getText().substring(0, i), -10, 0);			item.hide();			item.setCurrentTextdraw(newTextdraw);			item.display();			try {				Thread.sleep(10);			} catch (InterruptedException e) {				// TODO Auto-generated catch block				e.printStackTrace();			}		}		if(mPlayer != null)			mPlayer.playSound(1131);		for(int i=0;i<=10;i++) {			PlayerTextdraw newTextdraw = item.createTextDraw(item.getText(), i-10, 0);			item.hide();			item.setCurrentTextdraw(newTextdraw);			item.display();			try {				Thread.sleep(20);			} catch (InterruptedException e) {				// TODO Auto-generated catch block				e.printStackTrace();			}		}	}	private void checkItemDuration() {		try {			Iterator<DynamicItem> it = items.iterator();			while(it.hasNext()) {				DynamicItem item = it.next();				if(!item.isActive()) {					//Server.get().sendMessageToAll(Color.RED, "Removing item based on timestamp!");					// custom hide animation					for(int i=0;i<=item.getText().length();i++) {						PlayerTextdraw newTextdraw = item.createTextDraw(item.getText().substring(0, item.getText().length()-i), 0, item.getYPosition());						item.hide();						item.setCurrentTextdraw(newTextdraw);						item.display();						try {							Thread.sleep(10);						} catch (InterruptedException e) {							// TODO Auto-generated catch block							e.printStackTrace();						}					}					item.hide();						it.remove();				}			}		}		catch(Exception e) {			// TODO fix ConcurrentModificationException		}		//remove if necessary		if(items.size() == 0) {			combo = false;			//Server.get().sendMessageToAll(Color.BLUE, "COMBO:FALSE ("+items.size()+") ");			mPoints = 0;			if(mComboTextbase != null)				removeComboScore();		}	}	private void moveItemsDown() {		for(int i=0;i<18;i++) {			Iterator<DynamicItem> it = items.iterator();			while(it.hasNext()) {				DynamicItem item = it.next();				if(!item.isPending())					item.moveDown();				if(item.isRemovable()) {					if(items.contains(item)) {						item.hide();						it.remove();						//Server.get().sendMessageToAll(Color.RED, "REMOVE:"+items.size());					}				}			}			try {				Thread.sleep(30);			} catch (InterruptedException e) { }		} 	}	private void add(Player pPlayer, String text, int type) {		DynamicItem item = new DynamicItem(pPlayer, text, type);		items.add(item);	}	public void addPoints(Player pPlayer, String reason, int amount, int type) {		this.mPlayer = pPlayer;	// TODO INSECURE!!! Solve one queue per player in constructor!!!		//Addition by Alf21		if(!allowNegativePoints)		{			if(this.mPoints + amount < 0) { //Test auf negativen Wert				this.mPoints = 0;			} else {				this.mPoints += amount; 			}		} else {			this.mPoints += amount;		}		//end		add(pPlayer, reason+" "+amount, type);		//check if combo mode		if(items.size() > 1) {			combo = true;			//Server.get().sendMessageToAll(Color.BLUE, "COMBO:TRUE ("+items.size()+")");			if(mComboTextbase != null)				removeComboScore();		}	}	private void updateComboScore(Player pPlayer) {		if(mPoints == 0 || items.size() <= 1)			return;		String score = String.valueOf(mPoints);		mComboTextbase = PlayerTextdraw.create(pPlayer, 425, 310);		for(int i=0;i<=score.length();i++) {			mComboTextbase.setText(score.substring(0, i));			mComboTextbase.show();			try {				Thread.sleep(50);			} catch (InterruptedException e) {				// TODO Auto-generated catch block				e.printStackTrace();			}		}	}	private void removeComboScore() {		mComboTextbase.setText(" ");		mComboTextbase.hide();		mComboTextbase.destroy();	}}


    ----------------------------
    Firefox:


    Ich denke nicht, dass eine neue SAMP Version erscheint, da die Nachfrage immer weiter sinkt... Cooler würde ich es finden, wenn statt einer neuen SAMP Version das GTA so modifiziert wird bzw das nächste GTA so aussieht, dass die Community wieder Einfluss hätte, also über Selfhost Server... Dann könnte man sein SAMP Script nehmen, Objekte raus und dann für das neue GTA umbauen :D Wäre cool, wollte schon im Support anfragen, aber 1. wer fragt den Rockstar Support und 2. wer stellt eine solche Frage? ^^


    MfG Alf21

    So, habe mal ein wenig mit den Textdraw vom LVDM rumprobiert, und da fiel mir etwas auf :O Sobald man 2x solche Commands hintereinander macht bzw. 2x hintereinander Textdraws aufruft (damit diese runter 'sliden' / rutschen, um Platz für den neuen zu machen), wird die Console mit einem Haufen von Fehlermeldungen vollgespamt...


    Ich habe 2x hintereinander als Test "/test kill" aufgerufen und das kam raus:



    Wie kann ich es fixen oder ausblenden, funktionieren tut ja alles, aber es spamt und haut sehr in die Log files dann rein...? Es wird angezeigt, dass der Fehler in der Shoebill API liegt, so vollziehe ich das... Oder liegt das an dem Aufbau von der Textdraw-Methode, dass dort ein Fehler liegt?


    MfG Alf21 :)

    Okay, ich bin echt begeistert und dann lest ihr die Nachrichten noch so schnell.. Wusste gar nicht, dass ihr auch nen Support habt :D
    Das klingt sehr spannend aber auch sehr schwer / komplex umzusetzen, da muss man echt schon Ahnung haben, ich wusste denke mal nicht, wie ich PAWN implementieren sollte, Anfänge vllt, aber nicht wie man beides Verknüpft, also Hut ab und macht bitte weiter so, ich denke, ich bin nicht der Einzige, der sehr daran interessiert ist mit Java zu arbeiten :)


    Ich werde immer wieder reinschauen und denke auch aktiv hier dran arbeiten und mal gucken, wäre ne schöne Alternative auch für andere, 'spielerisch' Java zu lernen. Falls ihr Unterstützung braucht, stände ich zur Verfügung, falls ihr Beispielsweise noch keine Homepage oder Beschreibung oder Blog habt oder Docs erweitern wollt!


    Freue mich auf die neue Version! :thumbup:


    Thx 4 Answer!

    Ich habe gestern die API bzw. dein Programm getesten :) Ich habe echt ewig gebraucht um es aufzusetzen, da es durch Eclipse Luna irgendwie Komplikationen mit Maven gibt.
    Da ich Maven nicht nutzte, hatte ich keine Anleitung, wie ich es kompilieren sollte. Zum Glück habe ich dann doch noch im xml.ant - Build vom LVDM - GM gesehen, wie man es kompilieren kann :)


    Es klappt alles super, nur es wäre echt cool, wenn irgendwo ein Tutorial oder eine Übersichtsseite zu den Funktionen wäre oder wie man sie nutzt. Ein Startscript wie bei PAWN wäre auch nicht schlecht :D


    Ich persönlich finde Java besser. Ich finde, dass man mehr Freiheit hat. Doch es ist ziemlich kompliziert mit einem Werkzeugkasten ( Deine API ) zu arbeiten, wenn man nicht weiß, was im Werkzeugkasten drin steckt bzw. wie man das Werkzeug nutzt :D


    Habe gestern dann doch geschafft den Server aufzusetzen und es hat alles geklappt. Doch bevor ich ganz umsteige, eine Frage: Wo liegen die Grenzen bei Shoebill bzw. an welche Funktionen von PAWN/C++ kommt Shoebill nicht ran?


    Würde gerne zu Java umsteigen ( da wir in der Schule auch damit arbeiten und ich persönlich auch + zudem Android Applikationen auf Java geschrieben werden ).
    Ich bin auch sehr erstaunt dass SAMP noch immer lebt und Nemesis und du noch aktiv sind ( Posts von gestern ).
    Arbeitet ihr noch aktiv an SAMP? Oder ist es mittlerweile sinnlos überhaupt noch damit wieder anzufangen?


    Und was mich auch sehr interessiert, bietet Shoebill bessere Möglichkeiten, den Server vom Web aus zu steuern und upzudaten bzw. vom Computer aus den Webserver/das Script auf dem Webserver zu steuern?


    Schade dass mir Shoebill erst jetzt auffällt.
    Die Anleitung zum Aufsetzen von Shoebill, also das Tutorial war jedoch sehr übersichtlich und wirklich gut beschrieben, finde ich gut. Könnte man vllt auch ein Serverpaket oder Eclipse Projekt-Paket bereit stellen? Solche Projekte werden am besten angenommen, wenn man alles leicht hält. Manche haben vllt. ein kleines wenig mehr Ahnung von Java als von C++, doch wer springt einfach so ins kalte Wasser ;D :D


    PS: Der Downloadlink von Shoebill Server ist down, was die Arbeit viel komplizierter gemacht hat :D
    Vllt würden mit ein bisschen mehr Übersicht und Appell / mehr Öffentlichkeit, mehr 'Scripter' zu Shoebill umsteigen. Shoebill ist für mich ein sehr gelungenes Projekt mit wahrscheinlich viel Arbeit! Respekt ^^ Volle Punktzahl! :thumbup:8o

    Schaut sehr gut aus, ist ne schöne alternative wenn man sein Script nicht auf MySQL hat und die *.ini Dateien auslesen lassen will, hätte es früher hier rumgestanden, hätte ich damit gleich weitergemacht ;) Ich hab mir die Arbeit gemacht und die Spielerdaten auf MySQL umgeschrieben. Doch ich glaube ich werde mir die Arbeit für die 15 anstehenden Tabellen sparen und mal sehen ob ich mit diesem API was schönes anfangen kann ;) Man muss erstmal den Durchblick haben :thumbup: