Projekt Shoebill 1.2 - Schreibe Gamemodes in Java

Wichtiger Hinweis: Bitte ändert nicht manuell die Schriftfarbe auf schwarz sondern belasst es bei der Standardeinstellung. Somit tragt ihr dazu bei dass euer Text auch bei Verwendung unseren dunklen Forenstils noch lesbar ist!

Tipp: Ihr wollt längere Codeausschnitte oder Logfiles bereitstellen? Benutzt unseren eigenen PasteBin-Dienst Link
  • Hallo!


    Da ich mich grade wieder mit SAMP bzw. scripten für SAMP Server beschäftige, kommt mir das hier sehr gelegen.
    Ich habe 2 Fragen.


    Was passiert, wenn Shoebill eingestellt wird, bzw. nicht mehr supportet wird und eine neue SA-MP Version erscheint?
    Wenn jetzt z.B. 0.3z R2 Server erscheint oder gar 0.4a? Dann könnte man sein ganzes Script das man in Java geschrieben hat wegwerfen, wenn ich das richtig verstanden habe.


    Frage 2:
    Gibt es ein Wiki mit Einträgen? Im Deutschen Wiki ist ja irgendwie nichts drinnen^^
    http://de.shoebill.wikia.com/wiki/Shoebill_Wiki
    http://de.shoebill.wikia.com/wiki/Installation

  • 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

  • Firefox: Nein, dein Script müsstest du nicht ganz wegwerfen. Wir werden versuchen das Plugin stets auf dem aktuellsten Stand zu halten.
    Es ist keine große Mühe die neuen Funktionen zu unterstützen. Die Wiki wird in den nächsten Tagen mit dem Release von Version 1.1 erweitert. Außerdem werden wahrscheinlich auch Video-Anleitungen folgen.


    Alf21: So wie ich deinen Sourcecode verstehe versuchst du SAMP Funktionen aus einem anderen Thread aufzurufen. Verwende bitte dafür die Funktion .runOnSampThread();


    Code
    Shoebill.get().runOnSampThread(() -> {
    Textdraw.create();
    });
  • 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();	}}

  • Ich habe für die Leute die es nicht ohne Hilfe schaffen einen Server aufzusetzen ein Video gemacht:


    Externer Inhalt www.youtube.com
    Inhalte von externen Seiten werden ohne Ihre Zustimmung nicht automatisch geladen und angezeigt.
    Durch die Aktivierung der externen Inhalte erklären Sie sich damit einverstanden, dass personenbezogene Daten an Drittplattformen übermittelt werden. Mehr Informationen dazu haben wir in unserer Datenschutzerklärung zur Verfügung gestellt.

    https://www.youtube.com/watch?v=FLlFeNXPPN8

  • 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!

  • Beitrag von CynaxTV ()

    Dieser Beitrag wurde gelöscht, Informationen über den Löschvorgang sind nicht verfügbar.
  • Alf21: Du überprüfst nicht ob killer null ist:

    Code
    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);
    			}*/


    Mach es so:

    Code
    if(killer != null && killer.getName() != player.getName()) {
    				LvdmGamemode.queue.addPoints(killer, "GEGNER ELIMINIERT", 100, DynamicActionLabel.DynamicItem.TYPE_BIG);
    			}
  • Bei mir funktioniert alles, danke!

    Mittelsmann Service
    Seit 2014 agiere ich in diesem Forum als Mittelsmann. Als es Mein-Mittelsmann noch gab, zählte ich zu den vertrauenswürdigsten Mittelsmännern, welche auch hier im Forum aufgelistet waren. Seit Beginn meiner Laufbahn wickelte ich bisher schon rund 100 Transaktionen mit Erfolg ab. Wenn du also nach einem erfahrenen und vertrauenswürdigem Mittelsmann suchst, kontaktiere mich gerne.

  • 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 :)))

  • do.de - Domain-Offensive - Domains für alle und zu super Preisen
  • 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 :)

  • 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

  • Ich frage mich eher, warum du das überhaupt benötigst.
    Es gibt ja in Shoebill eine extra Klasse Player (siehe Beispiel: https://github.com/Shoebill/ex…le/lvdm/LvdmCommands.java).
    Eine Möglichkeit wäre es also eine Klasse von Player erben zu lassen und darin dann deine zusätzlich benötigten Membervariablen hinzuzufügen.


    LG

    Main: CPU: Intel Core i5-4440 @ 3,10 GHz | CPU-Cooling: Matterhorn -PURE- | RAM: 16GB Crucial Ballistix Sport DDR3-1600 DIMM CL9-9-9-24 |
    Motherboard: ASRock B85M Pro4 | GPU: Sapphire Radeon R9 390X Nitro 8GB GDDR5 |

    SSD: Samsung SSD 840 Evo 500GB | Power Supply: 550 Watt Corsair CS Series Modular 80+ Gold | Case: beQuiet! Silent Base 800


    As I walk through the valley of the shadow of death
    I take a look at my life and realize there's nothin' left.

  • 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.

  • Naja ich hab deinen Post so verstanden, dass du für jeden Spieler eine spezifische Variable erstellen willst.
    Da es is in der Shoebill API ne Klasse für den Spieler gibt kannst du eine Klasse davon ableiten (Keyword "extends") und dann halt deine benötigten Membervariablen einfach hinzufügst.


    Edit: Der Sinn ist es ja auch objektorientiert mittels Java zu programmieren und nicht die funktionale Denkweise zu übernehmen.

    Main: CPU: Intel Core i5-4440 @ 3,10 GHz | CPU-Cooling: Matterhorn -PURE- | RAM: 16GB Crucial Ballistix Sport DDR3-1600 DIMM CL9-9-9-24 |
    Motherboard: ASRock B85M Pro4 | GPU: Sapphire Radeon R9 390X Nitro 8GB GDDR5 |

    SSD: Samsung SSD 840 Evo 500GB | Power Supply: 550 Watt Corsair CS Series Modular 80+ Gold | Case: beQuiet! Silent Base 800


    As I walk through the valley of the shadow of death
    I take a look at my life and realize there's nothin' left.

  • Stimmt hast recht :D
    Nur ich kam selbst nicht auf die Lösung da es ne ne public function sein soll und das alles im DeathEvent Handler abläuft, und da man nach dem Tod neu spawnt und ich die Nachricht anzeigen wollte, von wem man getötet wurde, wollte ich den letzten Killer speichern um es auch in anderen Funktionen nutzen zu können. Aber stimmt, man könnte über 'extends' den Killer der Klasse bekommen... hatte wohl die falsche Realisierungsrichtung eingeschlagen ^^


    Thx für die Hilfe, Problem gelöst :D

  • Alf21: Wenn du Informationen über einen Spieler speichern möchtest hast du mehre Möglichkeiten. Du kannst das PVar-System von Pawn benutzen, was aber nicht zu empfehlen ist.
    Besser ist der PlayerLifecycleHolder aus dem shoebill-common Paket. Diesen verwendest du so:



    Als erstes brauchst du eine Klasse die deine Variablen und Methoden zum Spieler enthalten soll. Die erstellst du so:


    Gehe dabei sicher, dass deine Klasse das PlayerLifecycleObject erweitert. Da du nun eine Klasse hast, kannst du den PlayerLifecycleHolder anlegen.
    Bei onEnable() z.B:


    Code
    PlayerLifecycleHolder playerLifecycleHolder = new PlayerLifecycleHolder(getEventManager()); 
    playerLifecycleHolder.registerClass(GamePlayer.class, (eventManager, p) -> new GamePlayer(eventManager, p));


    Wichtig ist, dass du .registerClass() aufrufst. Der LifecylceHolder legt nun automatisch eine Instanz deiner Klasse an, wenn der Spieler den Server betritt, und zerstört diese wieder, wenn er den Server verlässt.
    Hier ein Beispiel wie du deine GamePlayer-Klasse bekommst, wenn du nur eine Player-Instanz hast:


    Code
    GamePlayer playerClass = playerLifecycleHolder.getObject(event.getPlayer(), GamePlayer.class);


    Alternativ kannst du dir auch alle Instanzen in eine Collection holen:


    Code
    Collection<GamePlayer> players = playerLifecycleHolder.getObjects(GamePlayer.class);


    Wenn du eine GamePlayer-Instanz hast, bekommst du so deinen Spieler zurück:

    Code
    Player player = gamePlayer.getPlayer();
  • do.de - Domain-Offensive - Domains für alle und zu super Preisen