Projekt Shoebill 1.2 - Schreibe Gamemodes in Java

    Diese Seite verwendet Cookies. Durch die Nutzung unserer Seite erklären Sie sich damit einverstanden, dass wir Cookies setzen. Weitere Informationen

    • Danke, gut erklärt :)

      @123marvin123:

      Danke, sehr gut erklärt, ich habe es verstanden, dank der Beispiele und Erläuterungen :)
      In meinem Gamemode funktioniert das jetzt, nur ganz durchblicke ich es doch noch nicht ^^
      Das Problem nun besteht darin, dass ich mich in einem EventManager (playerEventManager) befinde, welcher zB das PlayerDeathEvent,... regelt.
      Wie kann ich dort eine Instanz kreieren? Ist ja sozusagen dann eine Instanz in etwas was eine Instanz erstellen soll :/

      Ziel: Ich will den Killer von PlayerDeathEvent nach PlayerSpawnEvent bringen/vererben:
      Spoiler anzeigen

      Java-Quellcode

      1. package com.samp.lvdm;
      2. import java.util.Random;
      3. import net.gtaun.shoebill.Shoebill;
      4. import net.gtaun.shoebill.common.command.CommandGroup;
      5. import net.gtaun.shoebill.common.command.PlayerCommandManager;
      6. import net.gtaun.shoebill.common.player.PlayerLifecycleHolder;
      7. import net.gtaun.shoebill.constant.WeaponModel;
      8. import net.gtaun.shoebill.data.Color;
      9. import net.gtaun.shoebill.data.Vector3D;
      10. import net.gtaun.shoebill.event.player.PlayerCommandEvent;
      11. import net.gtaun.shoebill.event.player.PlayerConnectEvent;
      12. import net.gtaun.shoebill.event.player.PlayerDeathEvent;
      13. import net.gtaun.shoebill.event.player.PlayerDisconnectEvent;
      14. import net.gtaun.shoebill.event.player.PlayerRequestClassEvent;
      15. import net.gtaun.shoebill.event.player.PlayerSpawnEvent;
      16. import net.gtaun.shoebill.event.player.PlayerUpdateEvent;
      17. import net.gtaun.shoebill.event.player.PlayerWeaponShotEvent;
      18. import net.gtaun.shoebill.object.Player;
      19. import net.gtaun.util.event.EventManager;
      20. import net.gtaun.util.event.EventManagerNode;
      21. import net.gtaun.util.event.HandlerPriority;
      22. public class PlayerManager
      23. {
      24. public static final int MAX_PLAYERS = LvdmGamemode.MAX_PLAYERS;
      25. private boolean suicid = false;
      26. private boolean killed = false;
      27. private Player[] lastKiller = new Player[MAX_PLAYERS];
      28. private static final int INITIAL_MONEY = 50000;
      29. private static final Vector3D[] RANDOM_SPAWNS =
      30. {
      31. new Vector3D(1958.3783f, 1343.1572f, 15.3746f),
      32. new Vector3D(2199.6531f, 1393.3678f, 10.8203f),
      33. new Vector3D(2483.5977f, 1222.0825f, 10.8203f),
      34. new Vector3D(2637.2712f, 1129.2743f, 11.1797f),
      35. new Vector3D(2000.0106f, 1521.1111f, 17.0625f),
      36. new Vector3D(2024.8190f, 1917.9425f, 12.3386f),
      37. new Vector3D(2261.9048f, 2035.9547f, 10.8203f),
      38. new Vector3D(2262.0986f, 2398.6572f, 10.8203f),
      39. new Vector3D(2244.2566f, 2523.7280f, 10.8203f),
      40. new Vector3D(2335.3228f, 2786.4478f, 10.8203f),
      41. new Vector3D(2150.0186f, 2734.2297f, 11.1763f),
      42. new Vector3D(2158.0811f, 2797.5488f, 10.8203f),
      43. new Vector3D(1969.8301f, 2722.8564f, 10.8203f),
      44. new Vector3D(1652.0555f, 2709.4072f, 10.8265f),
      45. new Vector3D(1564.0052f, 2756.9463f, 10.8203f),
      46. new Vector3D(1271.5452f, 2554.0227f, 10.8203f),
      47. new Vector3D(1441.5894f, 2567.9099f, 10.8203f),
      48. new Vector3D(1480.6473f, 2213.5718f, 11.0234f),
      49. new Vector3D(1400.5906f, 2225.6960f, 11.0234f),
      50. new Vector3D(1598.8419f, 2221.5676f, 11.0625f),
      51. new Vector3D(1318.7759f, 1251.3580f, 10.8203f),
      52. new Vector3D(1558.0731f, 1007.8292f, 10.8125f),
      53. new Vector3D(-857.0551f, 1536.6832f, 22.5870f),
      54. new Vector3D(817.3494f, 856.5039f, 12.7891f),
      55. new Vector3D(116.9315f, 1110.1823f, 13.6094f),
      56. new Vector3D(-18.8529f, 1176.0159f, 19.5634f),
      57. new Vector3D(-315.0575f, 1774.0636f, 43.6406f),
      58. new Vector3D(1705.2347f, 1025.6808f, 10.8203f)
      59. };
      60. private EventManagerNode eventManagerNode;
      61. private PlayerCommandManager commandManager;
      62. private Random random;
      63. public PlayerManager(EventManager rootEventManager)
      64. {
      65. random = new Random();
      66. eventManagerNode = rootEventManager.createChildNode();
      67. commandManager = new PlayerCommandManager(eventManagerNode);
      68. commandManager.installCommandHandler(HandlerPriority.NORMAL);
      69. commandManager.registerCommands(new LvdmCommands());
      70. commandManager.registerCommands(new TestCommands());
      71. commandManager.registerCommands(new AdminCommands());
      72. // Example: register /test [command] ...
      73. CommandGroup testGroup = new CommandGroup();
      74. testGroup.registerCommands(new TestCommands());
      75. commandManager.registerChildGroup(testGroup, "test");
      76. // Example: register /admin [command] ...
      77. CommandGroup adminCommands = new CommandGroup();
      78. adminCommands.registerCommands(new AdminCommands());
      79. commandManager.registerChildGroup(adminCommands, "admin");
      80. commandManager.setUsageMessageSupplier((player, command, prefix, params, help) -> {
      81. String message = prefix + command;
      82. for (String param : params) {
      83. message += " [" + param + "]";
      84. }
      85. return message;
      86. });
      87. //--
      88. eventManagerNode.registerHandler(PlayerUpdateEvent.class, (e) ->
      89. {
      90. Player player = e.getPlayer();
      91. // getUpdateCount() Example
      92. if (player.getUpdateCount() % 100 == 0)
      93. {
      94. player.setScore(player.getMoney());
      95. }
      96. if(suicid) {
      97. Shoebill.get().runOnSampThread(() -> {
      98. LvdmGamemode.queue.addPoints(player, "SELBSTMORD", -100, DynamicActionLabel.DynamicItem.TYPE_BIG);
      99. });
      100. suicid = false;
      101. }
      102. if(killed) {
      103. Shoebill.get().runOnSampThread(() -> {
      104. LvdmGamemode.functions.showKiller(player, lastKiller[player.getId()]);
      105. });
      106. killed = false;
      107. }
      108. });
      109. eventManagerNode.registerHandler(PlayerWeaponShotEvent.class, (e) ->
      110. {
      111. // e.getPlayer().sendMessage(Color.LIGHTBLUE, String.format("WeaponShot: hittype: %1$s, weapon: %2$s, pos: %3$s", e.getHitType(), e.getWeapon(), e.getPosition()));
      112. });
      113. eventManagerNode.registerHandler(PlayerConnectEvent.class, (e) ->
      114. {
      115. Player player = e.getPlayer();
      116. player.sendGameText(5000, 5, "~w~SA-MP: ~r~Las Venturas ~g~MoneyGrub");
      117. Player.sendMessageToAll(Color.GREEN,player.getName()+" Connected!");
      118. player.sendMessage(Color.PURPLE, "Welcome to Las Venturas MoneyGrub, For help type /help.");
      119. Player.sendDeathMessageToAll(player, null, WeaponModel.CONNECT);
      120. Color color = new Color();
      121. do color.setValue(random.nextInt()); while (color.getY() < 128);
      122. player.setColor(color);
      123. });
      124. eventManagerNode.registerHandler(PlayerDisconnectEvent.class, (e) ->
      125. {
      126. Player player = e.getPlayer();
      127. Player.sendMessageToAll(Color.RED,player.getName()+" Disconnected!");
      128. Player.sendDeathMessageToAll(player, null, WeaponModel.DISCONNECT);
      129. });
      130. eventManagerNode.registerHandler(PlayerSpawnEvent.class, (e) ->
      131. {
      132. Player player = e.getPlayer();
      133. player.giveMoney(INITIAL_MONEY);
      134. player.toggleClock(true);
      135. setRandomSpawnPos(player);
      136. if(suicid) {
      137. Shoebill.get().runOnSampThread(() -> {
      138. LvdmGamemode.queue.addPoints(player, "SELBSTMORD", -100, DynamicActionLabel.DynamicItem.TYPE_BIG);
      139. });
      140. suicid = false;
      141. }
      142. if(killed) {
      143. Shoebill.get().runOnSampThread(() -> {
      144. LvdmGamemode.functions.showKiller(player, lastKiller[player.getId()]);
      145. });
      146. killed = false;
      147. }
      148. });
      149. eventManagerNode.registerHandler(PlayerDeathEvent.class, (e) ->
      150. {
      151. Player player = e.getPlayer();
      152. Player killer = e.getKiller();
      153. player.setMoney(0);
      154. Player.sendDeathMessageToAll(killer, player, e.getReason());
      155. if (killer != null) {
      156. killer.giveMoney(player.getMoney());
      157. }
      158. if(killer != null && killer.getName() != player.getName()) {
      159. LvdmGamemode.queue.addPoints(killer, "GEGNER ELIMINIERT", 100, DynamicActionLabel.DynamicItem.TYPE_BIG);
      160. if(LvdmGamemode.MessageOnRespawnAfterDead) {
      161. killed = true;
      162. lastKiller[player.getId()] = killer;
      163. } else {
      164. LvdmGamemode.functions.showKiller(player, killer);
      165. }
      166. }
      167. else if(killer == null && player != null || killer.getName() == player.getName()) {
      168. if(LvdmGamemode.MessageOnRespawnAfterDead) {
      169. suicid = true;
      170. } else {
      171. LvdmGamemode.queue.addPoints(player, "SELBSTMORD", -100, DynamicActionLabel.DynamicItem.TYPE_BIG);
      172. }
      173. }
      174. });
      175. eventManagerNode.registerHandler(PlayerRequestClassEvent.class, (e) ->
      176. {
      177. Player player = e.getPlayer();
      178. setupForClassSelection(player);
      179. });
      180. eventManagerNode.registerHandler(PlayerCommandEvent.class, HandlerPriority.BOTTOM, (e) ->
      181. {
      182. Player player = e.getPlayer();
      183. player.sendMessage(Color.RED, "Unknown command. Type /help to see help.");
      184. e.setProcessed();
      185. });
      186. }
      187. public void uninitialize()
      188. {
      189. commandManager.destroy();
      190. eventManagerNode.destroy();
      191. }
      192. private void setRandomSpawnPos(Player player)
      193. {
      194. int rand = random.nextInt(RANDOM_SPAWNS.length);
      195. player.setLocation(RANDOM_SPAWNS[rand]);
      196. player.setInterior(0);
      197. }
      198. private void setupForClassSelection(Player player)
      199. {
      200. player.setInterior(14);
      201. player.setLocation(258.4893f, -41.4008f, 1002.0234f);
      202. player.setAngle(270.0f);
      203. player.setCameraPosition(256.0815f, -43.0475f, 1004.0234f);
      204. player.setCameraLookAt(258.4893f, -41.4008f, 1002.0234f);
      205. }
      206. }
      Alles anzeigen



      Thx und danke für die Hilfe :thumbsup:
      Musst dir das mit den Instanzen merken, für nen Tutorial oder so, war gut erklärt und würde bst noch anderen helfen, falls sie es nicht wussten wie ich ^^
      (Ich nutze normalerweise sehr viele Variablen :/)

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

      Habe es nun im EventHandler/Manager über folgendes gelöst:

      Quellcode

      1. PlayerLifecycleHolder playerLifecycleHolder = new PlayerLifecycleHolder(rootEventManager.createChildNode());
      2. playerLifecycleHolder.registerClass(Lifecycle.class, (lifecycle, p) -> new Lifecycle(lifecycle, p));


      Das doofe ist nur immer ein neuen Lifecycle.getObjects in jedem Event zu erstellen... Kann man nicht statt dessen ein globalen Array erstellen mit MAX_PLAYERS, welcher dann beim PlayerConnectEvent bzw PlayerRequestClassEvent auf die playerid abgestimmt wird und so dann immer wieder aufrufbar ist, ohne neu zu definieren? :D

      Bsp.:

      Quellcode

      1. //Vars deklarieren
      2. public static final int MAX_PLAYERS = 500;
      3. private static PlayerLifecycleHolder playerLifecycleHolder;
      4. private Lifecycle[] playerLifecycle = new Lifecycle[MAX_PLAYERS];
      5. //Vars setzen
      6. eventManagerNode.registerHandler(PlayerRequestClassEvent.class, (e) ->
      7. {
      8. playerLifecycle[e.getPlayer().getId()] = playerLifecycleHolder.getObject(e.getPlayer(), Lifecycle.class);
      9. Player player = e.getPlayer();
      10. setupForClassSelection(player);
      11. });
      12. //Vars nutzen
      13. //in ieinem Event:
      14. Player killer = playerLifecycle[e.getPlayer().getId()].getLastKiller();
      Alles anzeigen


      Kann man das auch anders aber einfacher als meine Methode machen oder ist deine wirklich die beste in dem Fall?
      Immer getObject in jeder Methode ist auch nicht soo toll, aber wäre auch nicht schlimm, hilft ja sehr :D
      Nur ich finde es bei meiner Methode nervig, dass man nach jeder Abfrage dann immer ''playerLifecycle[e.getPlayer().getId()]."... schreiben muss :D

      Und wäre meine nicht sicherer? Könnte ja sein, dass sich die playerLifecycle überschreiben, wenn zB 2 gleichzeitig sterben (Explosion) ?

      Dieser Beitrag wurde bereits 2 mal editiert, zuletzt von Alf21 () aus folgendem Grund: Lösung gefunden :) Thx !

    • Du könntest einen EventHandler für den Spieler erstellen:

      Quellcode

      1. eventManager.registerHandler(PlayerDeathEvent.class, (e) -> {
      2. Player killer = e.getKiller();
      3. Player player = e.getPlayer();
      4. if(killer != null) {
      5. EventManagerNode node = eventManagerNode.createChildNode();
      6. node.registerHandler(PlayerSpawnEvent.class, HandlerPriority.NORMAL, Attentions.create().object(player), (e2) -> {
      7. player.sendMessage(Color.RED, "* Du bist eben gestorben und wurdest vom Spieler " + killer.getName() + " getötet.");
      8. player.sendMessage(Color.RED, "* Aber jetzt lebst du ja wieder :)");
      9. node.destroy();
      10. });
      11. }
      12. });
      Alles anzeigen


      Ich bin mir nicht sicher ob es funktioniert, es ist aber einen Versuch wert. Mit den Attentions kannst du ein Event für einen bestimmten Spieler/Fahrzeug/etc. filtern.
      Es wird also nur für den einen Spieler aufgerufen ;)
    • Thx, läuft alles super! :)

      Also gibts - wie immer in Java - mehrere Möglichkeiten, es zu realisieren.
      Ich denke ich nehme das mit den Instanzen bei Werten, welche ich später noch brauche und das mit dem neuen EventHandler bei den Sachen, die einfach nur einmal ihren Zweck erfüllen sollen.

      Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von Alf21 ()

    • Solange unser Buildserver nicht erreichbar ist, könnt ihr auch die Sonatype Repo verwenden. (oss.sonatype.org/content/repositories/snapshots/)

      In der pom.xml tragt ihr bei repositories folgendes ein:

      Quellcode

      1. <repository>
      2. <id>sonatype-nexus-snapshots</id>
      3. <name>Sonatype Nexus Snapshots</name>
      4. <url>https://oss.sonatype.org/content/repositories/snapshots/</url>
      5. <snapshots>
      6. <enabled>true</enabled>
      7. <updatePolicy>daily</updatePolicy>
      8. </snapshots>
      9. </repository>


      //Update: Shoebill 1.1 wurde soeben released.
      Die neue Version ermöglicht es euch, Pawn Gamemodes und Filterscripts gleichzeitig mit Shoebill Gamemodes zu verwenden.
      Ein genaueres Tutorial folgt noch. Download im Startthread. Wenn ihr updaten möchtet, dann nehmt den updater aus dem neuen Downloadpaket und führt update-shoebill.bat aus.

      Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von 123marvin123 ()

    • Kleiner Beta2 Fix von LVDM DynamicActionLabel.java

      >>edit:
      @123marvin123:

      Die Links zu den Downloads sind wohl broken, es wird URL not request glaube angezeigt bei beiden...
      Ehm... Ich habe jetzt einfach von der GitHub gedownloaded, mal gucken ob es klappt

      Und wenn alles klappt und auch so, hammer Arbeit ! :thumbsup:

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

      Hab mir mal die Arbeit (^^) gemacht, um nen kleinen Fix in die DynamicActionLabel.java reinzuhauen.

      Frage: Habt ihr für dieses Problem eine bessere/saubere/stabilere Lösung? Diese braucht recht viel Performance :/

      >>update: Bugs gefixt

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

      Fix der Bugs des ersten 'Beta' Posts ^^
      Man kann nun Farben und andere "~"/Tilde in den Inputs/Reasons nutzen (like ~r~, ~h~)
      Das einzige was noch erledigt werden muss: Max String Länge mit Autoremove, um Fehlermeldungen und hässlichem Aussehen voraus zu sein ;)

      DynamicActionLabel.java
      Spoiler anzeigen

      Java-Quellcode

      1. //Bug: Die max. Länge des input Strings sollte noch definiert werden, bzw ein Erkennungs- und Kürzungssystem eingebaut werden, um Fehlermeldungen zu vermeiden
      2. //Anfällig: Für Spams von Strings -> Fehler
      3. //Lsg.: Input einlesen, kürzen, ausgeben ^^ Am besten gleich bei addPoints()/add() + Timeout gegen Spam?
      4. package com.samp.lvdm;
      5. import java.util.ArrayList;
      6. import java.util.Iterator;
      7. import java.util.List;
      8. import java.util.regex.*;
      9. import net.gtaun.shoebill.constant.TextDrawAlign;
      10. import net.gtaun.shoebill.exception.CreationFailedException;
      11. import net.gtaun.shoebill.object.Player;
      12. import net.gtaun.shoebill.object.PlayerTextdraw;
      13. public class DynamicActionLabel extends Thread {
      14. private ArrayList<DynamicItem> items = new ArrayList<DynamicItem>();
      15. private int mPoints = 0;
      16. private boolean combo = false;
      17. private PlayerTextdraw mComboTextbase = null;
      18. private Player mPlayer;
      19. public DynamicActionLabel() { }
      20. public class DynamicItem {
      21. public static final int TYPE_BIG = 1;
      22. public static final int TYPE_SMALL = 2;
      23. private int mYPosition = 0;
      24. private String mText;
      25. private Player mPlayer;
      26. private PlayerTextdraw mVisibleTextdraw;
      27. private boolean mRemovable = false;
      28. private boolean mPending = true;
      29. private long mTimestamp;
      30. private int mType;
      31. private PlayerTextdraw textdraw = null;
      32. public void setPending(boolean pStatus) {
      33. mPending = pStatus;
      34. }
      35. public boolean isActive() {
      36. return ((mTimestamp + 6) < (System.currentTimeMillis() / 1000l)) ? false : true;
      37. }
      38. public boolean isPending() {
      39. return mPending;
      40. }
      41. public boolean isRemovable() {
      42. return mRemovable;
      43. }
      44. public int getYPosition() {
      45. return mYPosition;
      46. }
      47. public String getText() {
      48. return mText;
      49. }
      50. public void setText(String pText) {
      51. mText = pText;
      52. }
      53. public DynamicItem(Player pPlayer, String pText, int pType) {
      54. this.mText = pText;
      55. this.mPlayer = pPlayer;
      56. this.mVisibleTextdraw = createTextDraw(mText, 0, 0);
      57. this.mTimestamp = (System.currentTimeMillis() / 1000l);
      58. this.mType = pType;
      59. }
      60. public PlayerTextdraw createTextDraw(String pText, int x, int y) {
      61. try {
      62. textdraw = PlayerTextdraw.create(mPlayer, 400+x, 310+y);
      63. textdraw.setText(pText);
      64. textdraw.setAlignment(TextDrawAlign.RIGHT);
      65. if(mType == TYPE_SMALL) {
      66. textdraw.setLetterSize(0.135f*3, 0.135f*6);
      67. }
      68. else if(mType == TYPE_BIG) {
      69. textdraw.setLetterSize(0.135f*4, 0.135f*8);
      70. }
      71. }
      72. catch(CreationFailedException e) {
      73. // catch(Exception e) {
      74. e.printStackTrace();
      75. }
      76. return textdraw;
      77. }
      78. public void setCurrentTextdraw(PlayerTextdraw pTextdraw) {
      79. mVisibleTextdraw = pTextdraw;
      80. }
      81. public void moveDown() {
      82. mYPosition++;
      83. if(mYPosition > 100) {
      84. mRemovable = true;
      85. }
      86. else {
      87. PlayerTextdraw newTextdraw = createTextDraw(mText, 0, mYPosition);
      88. hide();
      89. setCurrentTextdraw(newTextdraw);
      90. display();
      91. }
      92. }
      93. public void display() {
      94. if(mVisibleTextdraw != null)
      95. mVisibleTextdraw.show();
      96. }
      97. public void hide() {
      98. if(mVisibleTextdraw != null) {
      99. mVisibleTextdraw.hide();
      100. mVisibleTextdraw.destroy();
      101. }
      102. }
      103. }
      104. public void run() {
      105. while(!interrupted()) {
      106. //Server.get().sendMessageToAll(Color.BLUE, "Thread:"+Thread.currentThread().getName());
      107. checkItemDuration();
      108. if((mComboTextbase == null && mPlayer != null) || (mPlayer != null && !mComboTextbase.getText().equals(String.valueOf(mPoints))))
      109. updateComboScore(mPlayer);
      110. try {
      111. List<DynamicItem> newList = new ArrayList<DynamicItem>(items);
      112. Iterator<DynamicItem> it = newList.iterator();
      113. while(it.hasNext()) {
      114. DynamicItem item = it.next();
      115. if(item.isPending()) {
      116. moveItemsDown();
      117. // show pending item
      118. fadeItemIn(item);
      119. // unset pending status
      120. item.setPending(false);
      121. }
      122. }
      123. Thread.sleep(200);
      124. }
      125. catch(Exception e) {
      126. System.out.println(">>\t[Error]>> in run() :");
      127. e.printStackTrace();
      128. }
      129. }
      130. }
      131. private void fadeItemIn(DynamicItem item) {
      132. String text = item.getText();
      133. String text2 = text;
      134. //Addition to display Colors by Alf21
      135. //############################################################### WICHTIG ###########################################################
      136. //# Anfällig, wenn bei der String/Input/Reason zu groß ist oder gespamt wird! #
      137. //# Lsg.: Reason erkennen und kürzen + Timeout? #
      138. boolean colors = false;
      139. int colCount = 0;
      140. Matcher matcher = Pattern.compile("\u007E+\\w+\u007E").matcher(text);
      141. while(matcher.find()){
      142. colors = true;
      143. colCount++;
      144. }
      145. int length = text.length();
      146. if(colors){
      147. Matcher lastColor = Pattern.compile("\u007E+\\w\u007E\\z").matcher(text); //~r~|
      148. if(!lastColor.find()) {
      149. length = text.length()-(colCount-1)*3;
      150. }
      151. else { //Falls hinten eine Farbe ist, um 3 wegen dem Ausschwenken verkürzen, die Farbe sieht man eh nicht, den Ausschwenker jedoch schon
      152. length = text.length()-colCount*3;
      153. }
      154. }
      155. for(int i=0;i<=length;i++) {
      156. int i2 = i;
      157. text2 = text.substring(0, i2);
      158. if(colors) {
      159. Matcher matcher1 = Pattern.compile("\u007E\\z").matcher(text2); //~|
      160. Matcher matcher2 = Pattern.compile("\u007E+\\w\\z").matcher(text2); //~r|
      161. Matcher matcher3 = Pattern.compile("\u007E+\\w\u007E+\\w\\z").matcher(text2); //~r~A|
      162. Matcher matcher4 = Pattern.compile("\u007E+\\w\u007E\\z").matcher(text2); //~r~|
      163. /*
      164. * wenn: - der String ein "~"(Tilde) + [Buchstaben] enthält,
      165. * aber nicht, wenn: - der String selbst eine Farbangabe "~r~" ist
      166. * - keine "Buchstabe eines Wortes auf den Str folgt
      167. * Ergebnis: -> um 1 erweitern
      168. */
      169. if(matcher2.find() && !matcher3.find() && !matcher4.find()){
      170. i2 += 1;
      171. Matcher matcher5 = Pattern.compile("\u007E+\\w\u007E\\z").matcher(text.substring(0, i2));
      172. if(!matcher5.find()) {
      173. i2 -= 1;
      174. }
      175. }
      176. /*
      177. * wenn: - der String ein "~"(Tilde) enthält,
      178. * aber nicht, wenn: - der String selbst eine Farbangabe "~r~" ist
      179. * - keine "Buchstabe eines Wortes auf den Str folgt
      180. * Ergebnis: -> um 2 erweitern
      181. */
      182. else if(matcher1.find() && !matcher3.find() && !matcher4.find()){
      183. i2 += 2;
      184. Matcher matcher5 = Pattern.compile("\u007E+\\w\u007E\\z").matcher(text.substring(0, i2));
      185. if(!matcher5.find()) {
      186. i2 -= 2;
      187. }
      188. }
      189. }
      190. PlayerTextdraw newTextdraw = item.createTextDraw(text.substring(0, i2), -10, 0);
      191. item.hide();
      192. item.setCurrentTextdraw(newTextdraw);
      193. item.display();
      194. try {
      195. Thread.sleep(10);
      196. } catch (InterruptedException e) {
      197. // TODO Auto-generated catch block
      198. System.out.println(">>\t[Error]>> in fadeItemIn() :");
      199. e.printStackTrace();
      200. }
      201. }
      202. if(mPlayer != null)
      203. mPlayer.playSound(1131);
      204. for(int i=0;i<=10;i++) {
      205. PlayerTextdraw newTextdraw = item.createTextDraw(text, i-10, 0);
      206. item.hide();
      207. item.setCurrentTextdraw(newTextdraw);
      208. item.display();
      209. try {
      210. Thread.sleep(20);
      211. } catch (InterruptedException e) {
      212. // TODO Auto-generated catch block
      213. System.out.println(">>\t[Error]>> in fadeItemIn() :");
      214. e.printStackTrace();
      215. }
      216. }
      217. }
      218. private void checkItemDuration() {
      219. try {
      220. Iterator<DynamicItem> it = items.iterator();
      221. while(it.hasNext()) {
      222. DynamicItem item = it.next();
      223. if(!item.isActive()) {
      224. //Server.get().sendMessageToAll(Color.RED, "Removing item based on timestamp!");
      225. // custom hide animation
      226. String text = item.getText();
      227. String text2 = text;
      228. //Addition to display Colors by Alf21
      229. //############################################################### WICHTIG ###########################################################
      230. //# Anfällig, wenn bei der String/Input/Reason zu groß ist oder gespamt wird! #
      231. //# Lsg.: Reason erkennen und kürzen + Timeout? #
      232. boolean colors = false;
      233. int colCount = 0;
      234. Matcher matcher = Pattern.compile("\u007E+\\w+\u007E").matcher(text);
      235. while(matcher.find()){
      236. colors = true;
      237. colCount++;
      238. }
      239. int length = text.length();
      240. if(colors){
      241. Matcher lastColor = Pattern.compile("\u007E+\\w\u007E\\z").matcher(text); //~r~|
      242. if(!lastColor.find()) {
      243. length = text.length()-(colCount-1)*3;
      244. }
      245. else { //Falls hinten eine Farbe ist, um 3 wegen dem Ausschwenken verkürzen, die Farbe sieht man eh nicht, den Ausschwenker jedoch schon
      246. length = text.length()-colCount*3;
      247. }
      248. }
      249. for(int i=0;i<=length;i++) {
      250. int i2 = i;
      251. text2 = text.substring(0, length-i2);
      252. if(colors) {
      253. Matcher matcher1 = Pattern.compile("\u007E\\z").matcher(text2); //~|
      254. Matcher matcher2 = Pattern.compile("\u007E+\\w\\z").matcher(text2); //~r|
      255. Matcher matcher3 = Pattern.compile("\u007E+\\w\u007E+\\w\\z").matcher(text2); //~r~A|
      256. Matcher matcher4 = Pattern.compile("\u007E+\\w\u007E\\z").matcher(text2); //~r~|
      257. /*
      258. * wenn: - der String ein "~"(Tilde) + [Buchstaben] enthält,
      259. * aber nicht, wenn: - der String selbst eine Farbangabe "~r~" ist
      260. * - keine "Buchstabe eines Wortes auf den Str folgt
      261. * Ergebnis: -> um 1 erweitern
      262. *
      263. * Fix: Test, ob Erweiterung eine Farbe ergibt, falls nicht zurücksetzen
      264. */
      265. if(matcher2.find() && !matcher3.find() && !matcher4.find()){
      266. i2 += 2;
      267. Matcher matcher5 = Pattern.compile("\u007E+\\w\u007E\\z").matcher(text.substring(0, (length+3)-i2));
      268. if(!matcher5.find()) {
      269. i2 -= 2;
      270. }
      271. }
      272. /*
      273. * wenn: - der String ein "~"(Tilde) enthält,
      274. * aber nicht, wenn: - der String selbst eine Farbangabe "~r~" ist
      275. * - keine "Buchstabe eines Wortes auf den Str folgt
      276. * Ergebnis: -> um 2 erweitern
      277. *
      278. * Fix: Test, ob Erweiterung eine Farbe ergibt, falls nicht zurücksetzen
      279. */
      280. else if(matcher1.find() && !matcher3.find() && !matcher4.find()){
      281. i2 += 1;
      282. Matcher matcher5 = Pattern.compile("\u007E+\\w\u007E\\z").matcher(text.substring(0, (length+3)-i2));
      283. if(!matcher5.find()) {
      284. i2 -= 1;
      285. }
      286. }
      287. }
      288. PlayerTextdraw newTextdraw = item.createTextDraw(text.substring(0, length-i2), 0, item.getYPosition());
      289. item.hide();
      290. item.setCurrentTextdraw(newTextdraw);
      291. item.display();
      292. try {
      293. Thread.sleep(10);
      294. } catch (InterruptedException e) {
      295. // TODO Auto-generated catch block
      296. System.out.println(">>\t[Error]>> in checkItemDuration() :");
      297. e.printStackTrace();
      298. }
      299. }
      300. item.hide();
      301. it.remove();
      302. }
      303. }
      304. }
      305. catch(Exception e) {
      306. // TODO fix ConcurrentModificationException
      307. System.out.println(">>\t[Error]>> in checkItemDuration() :");
      308. e.printStackTrace();
      309. }
      310. //remove if necessary
      311. if(items.size() == 0) {
      312. combo = false;
      313. //Server.get().sendMessageToAll(Color.BLUE, "COMBO:FALSE ("+items.size()+") ");
      314. mPoints = 0;
      315. if(mComboTextbase != null)
      316. removeComboScore();
      317. }
      318. }
      319. private void moveItemsDown() {
      320. for(int i=0;i<18;i++) {
      321. Iterator<DynamicItem> it = items.iterator();
      322. while(it.hasNext()) {
      323. DynamicItem item = it.next();
      324. if(!item.isPending())
      325. item.moveDown();
      326. if(item.isRemovable()) {
      327. if(items.contains(item)) {
      328. item.hide();
      329. it.remove();
      330. //Server.get().sendMessageToAll(Color.RED, "REMOVE:"+items.size());
      331. }
      332. }
      333. }
      334. try {
      335. Thread.sleep(30);
      336. } catch (InterruptedException e) {
      337. System.out.println(">>\t[Error]>> in moveItemsDown() :");
      338. e.printStackTrace();
      339. }
      340. }
      341. }
      342. private void add(Player pPlayer, String text, int type) {
      343. DynamicItem item = new DynamicItem(pPlayer, text, type);
      344. items.add(item);
      345. }
      346. public void addPoints(Player pPlayer, String reason, int amount, int type) {
      347. this.mPlayer = pPlayer; // TODO INSECURE!!! Solve one queue per player in constructor!!!
      348. //Addition by Alf21
      349. if(!LvdmGamemode.allowNegativePoints)
      350. {
      351. if(this.mPoints + amount < 0) { //Test negative Value
      352. this.mPoints = 0;
      353. } else {
      354. this.mPoints += amount;
      355. }
      356. } else {
      357. this.mPoints += amount;
      358. }
      359. if(amount != 0) {
      360. add(pPlayer, reason+" "+amount, type);
      361. }
      362. else {
      363. add(pPlayer, reason, type);
      364. }
      365. //check if combo mode
      366. if(items.size() > 1) {
      367. combo = true;
      368. //Server.get().sendMessageToAll(Color.BLUE, "COMBO:TRUE ("+items.size()+")");
      369. if(mComboTextbase != null)
      370. removeComboScore();
      371. }
      372. }
      373. private void updateComboScore(Player pPlayer) {
      374. if(mPoints == 0 || items.size() <= 1)
      375. return;
      376. String score = String.valueOf(mPoints);
      377. mComboTextbase = PlayerTextdraw.create(pPlayer, 425, 310);
      378. for(int i=0;i<=score.length();i++) {
      379. mComboTextbase.setText(score.substring(0, i));
      380. mComboTextbase.show();
      381. try {
      382. Thread.sleep(50);
      383. } catch (InterruptedException e) {
      384. // TODO Auto-generated catch block
      385. System.out.println(">>\t[Error]>> in updateComboScore() :");
      386. e.printStackTrace();
      387. }
      388. }
      389. }
      390. private void removeComboScore() {
      391. mComboTextbase.setText(" ");
      392. mComboTextbase.hide();
      393. mComboTextbase.destroy();
      394. }
      395. }
      Alles anzeigen



      Zum Testen ein paar Commands, aber da es eine Beta ist, gibts auch hier noch ein paar Bugs: beim Spam-Nutzen des Commands 'testBeta6' wird eine kleine Fehlermeldung auftauchen bzw. beim nutzen von zB 2x 'testBeta6' + 'teamKill 0'
      Spoiler anzeigen

      Quellcode

      1. @Command
      2. @CommandHelp("/teamKill [playerID]")
      3. public boolean teamKill(Player p, int targetID) {
      4. Player.get(targetID).setHealth(0.0f);
      5. Shoebill.get().runOnSampThread(() -> {
      6. LvdmGamemode.queue.addPoints(p, "~r~TEAMKILL (~w~" + Player.get(targetID).getName() + "~r~)", -100, DynamicActionLabel.DynamicItem.TYPE_BIG);
      7. p.sendMessage(Color.RED, "* Du hast " + Player.get(targetID).getName() + " aus deinem Team getötet!");
      8. });
      9. return true;
      10. }
      11. @Command
      12. @CommandHelp("/testBeta1")
      13. public boolean testBeta1(Player player) {
      14. Shoebill.get().runOnSampThread(() -> {
      15. LvdmGamemode.queue.addPoints(player, "~g~Test1 (~w~start~g~)end", 20, DynamicActionLabel.DynamicItem.TYPE_BIG);
      16. });
      17. return true;
      18. }
      19. @Command
      20. @CommandHelp("/testBeta2")
      21. public boolean testBeta2(Player player) {
      22. Shoebill.get().runOnSampThread(() -> {
      23. LvdmGamemode.queue.addPoints(player, "~g~Test2 (~w~start~g~)end~r~", 20, DynamicActionLabel.DynamicItem.TYPE_BIG);
      24. });
      25. return true;
      26. }
      27. @Command
      28. @CommandHelp("/testBeta3")
      29. public boolean testBeta3(Player player) {
      30. Shoebill.get().runOnSampThread(() -> {
      31. LvdmGamemode.queue.addPoints(player, "~g~Test3 ~y~(~w~start~g~)end~r~", 20, DynamicActionLabel.DynamicItem.TYPE_BIG);
      32. });
      33. return true;
      34. }
      35. @Command
      36. @CommandHelp("/testBeta4")
      37. public boolean testBeta4(Player player) {
      38. Shoebill.get().runOnSampThread(() -> {
      39. LvdmGamemode.queue.addPoints(player, "~g~Test4 ~p~(~w~start~g~)hfu~b~dus~x~dhffhu~r~", 20, DynamicActionLabel.DynamicItem.TYPE_BIG);
      40. });
      41. return true;
      42. }
      43. @Command
      44. @CommandHelp("/testBeta5")
      45. public boolean testBeta5(Player player) {
      46. Shoebill.get().runOnSampThread(() -> {
      47. LvdmGamemode.queue.addPoints(player, "~g~Test5 ~p~(~w~start~g~)hfu~b~dus~x~dhffhu", 20, DynamicActionLabel.DynamicItem.TYPE_BIG);
      48. });
      49. return true;
      50. }
      51. @Command
      52. @CommandHelp("/testBeta6")
      53. public boolean testBeta6(Player player) {
      54. Shoebill.get().runOnSampThread(() -> {
      55. LvdmGamemode.queue.addPoints(player, "~g~Test6 ~p~(~w~start~g~)fu~b~dsh~fs~x~dhffhu~", 20, DynamicActionLabel.DynamicItem.TYPE_BIG);
      56. });
      57. return true;
      58. }
      59. @Command
      60. @CommandHelp("/heal [HP]")
      61. public boolean heal(Player p, String params) //String, um es später auf Float und Double zu parsen...
      62. {
      63. try {
      64. Float.parseFloat(params);
      65. Double.parseDouble(params);
      66. } catch (NumberFormatException e) {
      67. /* e.printStackTrace();
      68. System.out.println(">>\t[ERROR] in heal ::::: in AdminCommands");*/
      69. p.sendMessage(Color.RED, ">>[ERROR]: Dein Parameter muss eine Zahl sein!");
      70. return false;
      71. }
      72. LvdmGamemode.queue.addPoints(p, "Geheilt auf " + Double.parseDouble(params) + " Leben", -100, DynamicActionLabel.DynamicItem.TYPE_BIG);
      73. p.setHealth(Float.parseFloat(params));
      74. return true;
      75. }
      76. @Command
      77. @CommandHelp("/explode [playerID]")
      78. public boolean explode(Player p, int pID) {
      79. float x, y, z;
      80. // Get the player's position
      81. AngledLocation locationTarget = Player.get(pID).getLocation();
      82. x = locationTarget.getX();
      83. y = locationTarget.getY();
      84. z = locationTarget.getZ();
      85. // Create an explosion at the player's position
      86. Player.get(pID).createExplosion(x, y, z, 12, 10);
      87. return true;
      88. }
      Alles anzeigen



      MfG Alf21

      Dieser Beitrag wurde bereits 5 mal editiert, zuletzt von Alf21 () aus folgendem Grund: Beta2 Fix

    • Fehler seit neuem Update

      mir fehlt seit dem neuen Update die net/gtaun/shoebill/event/server/GameModeInitEvent, weshalb der Server denke nicht starten will:

      Fehlermeldung:

      Quellcode

      1. [2014-12-31 00:58:24][ERROR][err] java.lang.NoClassDefFoundError: net/gtaun/shoebill/event/server/GameModeInitEvent
      2. [2014-12-31 00:58:24][ERROR][err] at net.gtaun.shoebill.ShoebillImpl.initialize(ShoebillImpl.java:305)
      3. [2014-12-31 00:58:24][ERROR][err] at net.gtaun.shoebill.ShoebillImpl.access$100(ShoebillImpl.java:47)
      4. [2014-12-31 00:58:24][ERROR][err] at net.gtaun.shoebill.ShoebillImpl$1.onShoebillLoad(ShoebillImpl.java:287)
      5. [2014-12-31 00:58:24][ERROR][err] at net.gtaun.shoebill.samp.SampCallbackManagerImpl$1$$Lambda$7/20228826.call(Unknown Source)
      6. [2014-12-31 00:58:24][ERROR][err] at net.gtaun.shoebill.util.TryUtils.tryTo(TryUtils.java:21)
      7. [2014-12-31 00:58:24][ERROR][err] at net.gtaun.shoebill.util.TryUtils.tryTo(TryUtils.java:14)
      8. [2014-12-31 00:58:24][ERROR][err] at net.gtaun.shoebill.samp.SampCallbackManagerImpl$1.lambda$onShoebillLoad$16(SampCallbackManagerImpl.java:80)
      9. [2014-12-31 00:58:24][ERROR][err] at net.gtaun.shoebill.samp.SampCallbackManagerImpl$1$$Lambda$6/4125570.accept(Unknown Source)
      10. [2014-12-31 00:58:24][ERROR][err] at java.util.stream.ForEachOps$ForEachOp$OfRef.accept(ForEachOps.java:183)
      11. [2014-12-31 00:58:24][ERROR][err] at java.util.stream.ReferencePipeline$2$1.accept(ReferencePipeline.java:175)
      12. [2014-12-31 00:58:24][ERROR][err] at java.util.concurrent.ConcurrentLinkedQueue$CLQSpliterator.forEachRemaining(ConcurrentLinkedQueue.java:851)
      13. [2014-12-31 00:58:24][ERROR][err] at java.util.stream.AbstractPipeline.copyInto(AbstractPipeline.java:512)
      14. [2014-12-31 00:58:24][ERROR][err] at java.util.stream.AbstractPipeline.wrapAndCopyInto(AbstractPipeline.java:502)
      15. [2014-12-31 00:58:24][ERROR][err] at java.util.stream.ForEachOps$ForEachOp.evaluateSequential(ForEachOps.java:150)
      16. [2014-12-31 00:58:24][ERROR][err] at java.util.stream.ForEachOps$ForEachOp$OfRef.evaluateSequential(ForEachOps.java:173)
      17. [2014-12-31 00:58:24][ERROR][err] at java.util.stream.AbstractPipeline.evaluate(AbstractPipeline.java:234)
      18. [2014-12-31 00:58:24][ERROR][err] at java.util.stream.ReferencePipeline.forEach(ReferencePipeline.java:418)
      19. [2014-12-31 00:58:24][ERROR][err] at net.gtaun.shoebill.samp.SampCallbackManagerImpl$1.onShoebillLoad(SampCallbackManagerImpl.java:80)
      20. [2014-12-31 00:58:24][ERROR][err] Caused by: java.lang.ClassNotFoundException: net.gtaun.shoebill.event.server.GameModeInitEvent
      21. [2014-12-31 00:58:24][ERROR][err] at java.net.URLClassLoader$1.run(URLClassLoader.java:372)
      22. [2014-12-31 00:58:24][ERROR][err] at java.net.URLClassLoader$1.run(URLClassLoader.java:361)
      23. [2014-12-31 00:58:24][ERROR][err] at java.security.AccessController.doPrivileged(Native Method)
      24. [2014-12-31 00:58:24][ERROR][err] at java.net.URLClassLoader.findClass(URLClassLoader.java:360)
      25. [2014-12-31 00:58:24][ERROR][err] at java.lang.ClassLoader.loadClass(ClassLoader.java:424)
      26. [2014-12-31 00:58:24][ERROR][err] at java.net.FactoryURLClassLoader.loadClass(URLClassLoader.java:798)
      27. [2014-12-31 00:58:24][ERROR][err] at java.lang.ClassLoader.loadClass(ClassLoader.java:357)
      28. [2014-12-31 00:58:24][ERROR][err] ... 18 more
      Alles anzeigen


      Steht die iwo zum download zur Verfügung oder woran liegt es? :(

      Dieser Beitrag wurde bereits 4 mal editiert, zuletzt von Alf21 () aus folgendem Grund: Edit removed ^^

    • Dann hast du irgendwelche alten Artefakte. Wahrscheinlich eine alte shoebill-api.

      //Edit:
      Falls euer Server crasht wenn ihr ein Dialog anzeigt, bitte ich euch den mitgelieferten shoebill-updater zu verwenden. (update-shoebill.bat/sh)
      Dieser Bug sollte nun gefixxt sein, und euer Server sollte nicht aufgrund dieses Fehlers crashen.





      - Alle Callbacks die den Rückgabewert behandeln können nun korrekt in Shoebill verwendet werden. (PlayerUpdateEvent unterbrechen, PlayerTextEvent, etc.)
      - Es können nun native Funktionen von anderen Plugins aufgerufen werden. (Stelle dafür sicher das Shoebill in der server.cfg an erster Stelle steht)
      - Der player.spawn() Bug wurde behoben, die Spieler spawnen wie gewohnt

      (Benutzung)


      Callbacks unterbinden:

      PHP-Quellcode

      1. eventManager.registerHandler(PlayerTextEvent.class, event -> {
      2. if(event.getPlayer().isSpectating())
      3. event.disallow(); //There will be no message in the chat if the player is currently spectating somebody
      4. });


      Native Funktionen aufrufen (Streamer Beispiel):

      PHP-Quellcode

      1. AmxCallable createDynamicObject = null;
      2. for(AmxInstance instance : Shoebill.get().getAmxInstanceManager().getAmxInstances()) {
      3. createDynamicObject = instance.getNative("CreateDynamicObject");
      4. if(createDynamicObject != null) {
      5. //found CreateDynamicObject native, call it like this:
      6. createDynamicObject.call(18421, ....); //normal pawn arguments. Make sure you put a f after a Float value, like this: 13.0f or 0f
      7. break;
      8. }
      9. }


      Bitte benutzt den beigelegten shoebill-updater, weil sich der Launcher, das Plugin und die Runtime geändert haben. Einfach die update-shoebill.bat/sh Datei im Serverordner starten und die neusten Dateien werden runtergeladen.


      Ich hab mal ein kleines Video gemacht, wie mein ein einfaches Projekt in IntelliJ IDEA 14 aufsetzt:

      youtube.com/watch?v=g2SOqax3Euw



      Es wurde soeben ein wichtiger Fehler behoben. Ihr könnt mit dem mitgelieferten Updater (update-shoebill.bat/sh) die benötigten Dateien automatisch runterladen lassen.
      Ihr könnt jedoch auch die Dateien aus dem Startpost neu runterladen, und die Dateien ersetzen. Das Update sollte auf jeden Fall durchgeführt werden, wenn ihr die Sicherheit und Stabilität eures Servers nicht vernachlässigen wollt.

      //Edit: Update 4. März



      - Callbacks hooken & native Funktionen aufrufen
      - Eine Amx mit allen Callbacks ist nun nicht mehr nötig, Shoebill findet die Callbacks automatisch


      Wir sind froh, euch das neuste Update präsentieren zu dürfen. Das Update bringt die Möglichkeit Callbacks zu hooken.
      Bitte stellt sicher, dass ihr den shoebill-updater verwenden (update-shoebill.bat/sh im server Ordner), weile viele Dateien geändert wurden (shoebill-runtime, launcher, plugin, api)

      In diesem Beispiel werde ich euch zeigen, wie ihr Callbacks des Plugin FCNPC hooken könnt, und native Funktionen aufzurufen:
      (plugin url: forum.sa-mp.com/showthread.php?t=428066)

      Hook hinzufügen (Stellt sicher, dass ihr die Hook wieder löscht wenn der GM / das Plugin wieder entladen wird):

      PHP-Quellcode

      1. @Override
      2. protected void onEnable() throws Throwable {
      3. Shoebill.get().getAmxInstanceManager().hookCallback("FCNPC_OnCreate", amxCallEvent -> {
      4. System.out.println("FCNPC created a npc with id " + amxCallEvent.getParameters()[0]);
      5. }, "i");
      6. }
      7. @Override
      8. protected void onDisable() throws Throwable {
      9. Shoebill.get().getAmxInstanceManager().unhookCallback("FCNPC_OnCreate"); //hook wieder löschen
      10. }
      Alles anzeigen


      Der FCNPC_OnCreate Callback sieht wie folgt aus:
      public FCNPC_OnCreate(npcid);

      Wie man sieht, beinhaltet er einen Parameter (Integer). Also müssen wir diesen Parameter am Ende der .hookCallback() Methode registrieren. Es existieren folgende Datentypen:

      i -> Integer
      f -> Float
      s -> String

      Wenn man also einen Callback hat, der so aussieht:
      public OnPlayerChangeName(id, old_name, new_name[]);

      müsste man ihn wie folgt registrieren:

      PHP-Quellcode

      1. Shoebill.get().getAmxInstanceManager().hookCallback("OnPlayerChangeName", amxCallEvent -> {
      2. }, "iss");


      Wenn man nun einen NPC mithilfe von FCNPC erstellen möchte, muss die native Funktion aufgerufen werden (in einem Befehl z.B):
      Die Funktion dafür sieht wie folgt aus:
      native FCNPC_Create(name[]);

      Außerdem wird die ID des erstellten NPCs zurück gegeben:

      PHP-Quellcode

      1. @Command
      2. public boolean createnpc(Player player, String name) {
      3. AmxCallable nativeMethod = null;
      4. for(AmxInstance instance : Shoebill.get().getAmxInstanceManager().getAmxInstances()) { //durch alle amx Instanzen loopen
      5. if((nativeMethod = instance.getNative("FCNPC_Create")) != null) //checken ob die amx die methode enthält
      6. break; //if yes, break out of the loop
      7. }
      8. if(nativeMethod != null) { //falls die Methode gefunden wurde, wird sie ausgeführt wie folgt:
      9. player.sendMessage(Color.ORANGE, "* Exec with result: " + nativeMethod.call(name)); //gebe die erstelle Id and den Spieler zurück
      10. } else {
      11. player.sendMessage(Color.ORANGE, "* Not found!"); //Funktion nicht gefunden (plugin nicht geladen oder Tippfehler?)
      12. }
      13. return true;
      14. }
      Alles anzeigen




      - Dieses Update erlaubt es, Werte per Referenz zu übergeben (benötigt z.B. für GetPlayerName & GetPlayerPos)

      Um das neue Feature nutzen zu können, müsst ihr das Plugin und shoebill-api updaten. (update-shoebill.bat/sh in dem Server Ordner)

      So wird es benutzt:

      PHP-Quellcode

      1. @Command
      2. public boolean getmyname(Player player) { // /getmyname command
      3. AmxCallable nativeMethod = null;
      4. for(AmxInstance instance : Shoebill.get().getAmxInstanceManager().getAmxInstances()) {
      5. if((nativeMethod = instance.getNative("GetPlayerName")) != null)
      6. break;
      7. }
      8. if(nativeMethod != null) {
      9. ReferenceString str = new ReferenceString("", 32);
      10. nativeMethod.call(player.getId(), str, str.getLength()); //native GetPlayerName(playerid, str[], len);
      11. player.sendMessage(Color.ORANGE, "Dein Name lautet " + str.getValue());
      12. } else player.sendMessage(Color.ORANGE, "* Fehler!");
      13. return true;
      14. }
      Alles anzeigen


      Der Code ist natürlich nicht besonders nützlich, da man auch einfach player.getName(); verwenden kann, man kann jedoch auch native Funktionen von anderen Plugins aufrufen (z.B. FCNPC_GetPosition).
      Aktuell sind 3 Datentypen verfügbar:

      + ReferenceString
      + ReferenceFloat
      + ReferenceInt

      welche alle im Package net.gtaun.shoebill.amx.types zu finden sind.

      Dieser Beitrag wurde bereits 7 mal editiert, zuletzt von 123marvin123 () aus folgendem Grund: Update 4. März

    • Hey ich bins wieder ^^
      Was wäre die einfachste Methode zu checken, ob ein Spieler connected ist ?
      (PAWN: if(IsPlayerConnected(playerid)){...})
      wie mache ich das hier ? Über das neue Update mit den Referenzen oder das update am 25 Jan mit den Callbacks?
      leider gibt es im Internet keine Dokumentation :/
      Man sollte für Shoebill auch eine Übersicht machen, damit man schnell etwas findet und nicht nach Befehlen oder Abfragen / Klassennamen suchen muss :o

      Bin dabei einfach den Chat zu säubern (Chat-Saubermachen-Funktion^^), aber ist wohl schwerer als ich es dachte für mich 8|

    • @Alf21: Es gibt doch die Javadocs (Shoebill API & shoebill-common), da steht eigentlich alles an Funktionen drin was man wissen muss.

      Chat clearen würde ich so machen:

      Java-Quellcode

      1. for(Player p: Player.get()) { //Player.get() gibt ne Liste mit allen Spielern zurück
      2. for (int i = 0; i < 10; i++) { //10 anpassen, ka wie viele das sein müssen.
      3. p.sendMessage(Color.WHITE, "");
      4. }
      5. }

      bzw. wenn du den Chat von ALLEN Spielern löschen willst kannste auch einfach

      Java-Quellcode

      1. for (int i = 0; i < 10; i++) {
      2. Player.sendMessageToAll(Color.WHITE, "");
      3. }

      Kalcor schrieb:

      The fact is, I am right. And if you think I'm wrong, you are wrong.
    • MiX(eP) schrieb:

      Wie Installiert man das denn, damit ich es nutzen kann? Das ist mein einzigstes Problem :D
      @MiX(eP) :
      Dazu hat 123marvin123 extra ein Tutorial gemacht :D
      Ich nutze zB Eclipse. Ich habe alles der Anleitung nach gemacht, Downloads sind ja auch angegeben.
      Dann bin ich einfach in Eclipse unter Hilfe gegangen und unter Marktplatz. Dort kannst du dir kostenlos Maven downloaden, dazu musst du nur "m2e" als Plugin suchen und installieren, glaube das heißt iwie "m2e Support for Keppler S2" oder so ^^ Auf jeden Fall, falls das nicht geht muss du dir erst Keppler S2 oder wie das heißt downloaden, kannst du dort auch einfach suchen. Und fertig, dann musst du nur noch einrichten (Maven, einfach nach Installationsanleitung).

      Hier meine Maven Bsp. Datei:

      Quellcode

      1. <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"> <modelVersion>4.0.0</modelVersion> <groupId>[Dein Pfad, wie dein Package-Name, in dem der Gamemode ist, z.B. com.samp.gamemode]</groupId> <artifactId>Dein_Projektname</artifactId> <version>0.0.1-SNAPSHOT</version> <name>Dein_Projektname</name> <description>Deine Projekt Beschreibung</description> <url>Deine_URL_zur_Website</url> <properties> <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding> </properties> <repositories> <repository> <id>central</id> <name>Central</name> <url>http://repo1.maven.org/maven2/</url> </repository> <repository> <id>gtaun-public-repo</id> <name>GTAUN Public Repository</name> <url>http://repo.gtaun.net/content/groups/public</url> </repository> <repository> <id>sonatype-oss-snapshots</id> <name>Sonatype Oss Snapshots</name> <url>https://oss.sonatype.org/content/repositories/snapshots/</url> <snapshots> <enabled>true</enabled> <updatePolicy>daily</updatePolicy> </snapshots> </repository> </repositories> <dependencies> <dependency> <groupId>junit</groupId> <artifactId>junit</artifactId> <version>3.8.1</version> <scope>test</scope> </dependency> <dependency> <groupId>net.gtaun</groupId> <artifactId>shoebill-api</artifactId> <version>1.1-SNAPSHOT</version> <type>jar</type> <scope>compile</scope> </dependency> <dependency> <groupId>net.gtaun</groupId> <artifactId>shoebill-common</artifactId> <version>1.0-SNAPSHOT</version> <type>jar</type> <scope>compile</scope> </dependency>
      2. <dependency> <groupId>net.gtaun</groupId> <artifactId>shoebill-utilities</artifactId> <version>1.0-SNAPSHOT</version> <type>jar</type> <scope>compile</scope> </dependency>
      3. <dependency> <groupId>net.gtaun</groupId> <artifactId>util-event</artifactId> <version>1.0-SNAPSHOT</version> <type>jar</type> <scope>compile</scope> </dependency> </dependencies> <build> <defaultGoal>clean install</defaultGoal>
      4. <plugins> <plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-compiler-plugin</artifactId> <version>3.1</version> <configuration> <source>1.8</source> <target>1.8</target> </configuration> </plugin> <plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-jar-plugin</artifactId> <version>2.3.1</version> <configuration> <outputDirectory>[Dein Ausgabepfad, z.B. C:\Users\...]</outputDirectory> </configuration> </plugin> </plugins> </build></project>


      Dann ein Gamemode bauen, unter Debug -> Maven Install oder Maven Build ausführen, dann die jar in den ServerOrdner, unter shoebill->gamemodes, alles anpassen, also maven Pfad usw. in shoebill.yml und resources.yml und dann die Startup.bat ausführen ^^

      //edit

      Ich denke ich verstehe jetzt das Problem... Du meintest bestimmt wie man es auf nem Server wie einen externen Linux Server installiert. Falls ja, das Problem habe ich auch. Ich kann keinen Maven Path angeben und keine Ahnung, wie man das Shoebill Plugin da starten lässt...

      Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von Alf21 ()

    • Wie sieht das eigentlich aus mit Sicherung von Daten ?
      Bspw. ein Datein oder alternativ Datenbanken ?

      Kann man für Datein einfach die "Java Standards"(So nenn ich das jetzt einfach mal) nutzen ?
      Aber wie sieht es bspw. bei Datenbanken aus ?

      Bräuchte man dafür "Plugins" ?
      Wenn ja, muss man die für Shoebill anpassen ?
      "Bevor ich mir Informationen aus der "Bild" hole,
      werde ich anfangen, Wahlergebnisse danach vorauszusagen,
      neben welchen Busch unsere Katze gepinkelt hat."
      Margarete Stokowski
    • Du kannst ganz normal auf Datenbanktreiber für Java zugreifen und hast auch Zugriff aufs Dateisystem (wobei ich noch nie ausshalb des Scriptfiles Ordners war, von daher kann ich mir da irren).

      Besondere Plugins brauchst du nicht, es geht alles was du auch normal in Java nutzten kannst.

      Kalcor schrieb:

      The fact is, I am right. And if you think I'm wrong, you are wrong.

      Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von seegras ()

    • @MiX(eP): Du kannst die erstelle .jar Datei aus deiner Maven-Repo nehmen und auf den Server in den shoebill/gamemodes Ordner kopieren. Dann musst du nurnoch die benötigten Libs manuell in die resources.yml eintragen.

      @BlackAce: Das Shoebill Plugin (also die Binaries für den SAMP Server) erstellt eine Java Virtual Machine (JVM). Genau das selbe passiert, wenn du jedes andere Java Programm startest, wie z.B. Minecraft. Das heißt, du kannst jede Funktion von Java benutzen (Dateisystem verwalten, Emails senden, Daten von einem FTP-Server holen, Shell-Befehle ausführen oder direkt einen Webserver basierend auf Java). Außerdem kannst du jede Java Library verwenden, die existiert, wie z.B. Apache Commons. Dir steht alles offen, du kannst Mysql / MongoDB / Sqlite verwenden oder dein ganz eigenes Dateiformat entwerfen.
    • Das klingt mMn sehr gut :)

      Aber eine Frage hab ich noch, wie sieht es eigentlich mit der Unterstützung zukünfitger SA:MP Versionen aus ?

      Ich weiß Kalcor hat bisher immer einen recht entspannten Updatezyklus an den Tag gelegt, aber man weiß ja nie bei ihm :D
      "Bevor ich mir Informationen aus der "Bild" hole,
      werde ich anfangen, Wahlergebnisse danach vorauszusagen,
      neben welchen Busch unsere Katze gepinkelt hat."
      Margarete Stokowski
    • Wenn sich die Funktionen der Parametern nicht groß verändern funktioniert alles weiter. Bei neuen Callback und Funktionen die noch nicht von Shoebill implementiert wurden, kannst du auch die Nativen Interfaces von Shoebill benutzen, und jegliche Funktion aufrufen oder ein beliebiges Callback hooken. Das funktioniert übrigens auch mit jedem anderem Plugin auch, du kannst z.B. das Audio Plugin über Shoebill steuern und dessen Funktionen und Callback verwenden. Wenn du ein Beispiel sehen möchtest kannst du folgendes durchlesen -> Project Shoebill 1.1 - Schreibe Gamemodes in Java
    • An alle die Probleme mit den Anfängen haben, so wie ich :D
      Es gibt nen schönes Dealership Plugin für Shoebill / auf Java, daran kann man sich gut orientieren, zB wie man objektorientiert programmiert oder Sachen mit Dialogen und Lifecycles / Referenzen.

      Ich werde ein paar experimentelle Sachen ausprobieren, dennoch erstmal ein RPG Grundsystem aufbauen, mal sehen wie es wird ^^
    • Ich bekomme einen Syntax Fehler bei den Events.
      Nutze JRE 7

      Java-Quellcode

      1. eventManagerNode.registerHandler(PlayerSpawnEvent.class, (e) -> {
      2. Player player = e.getPlayer();
      3. player.giveMoney(INITIAL_MONEY);
      4. player.toggleClock(true);
      5. setRandomSpawnPos(player);
      6. });


      Edit

      Quellcode

      1. e cannot be resolved
      PayPal: herprince@outlook.de
      Twitter
      DeviantArt

      Programmierung Service
      JAVA (bspw. Android Applikationen, Modifikationen bzw. Plugins für Minecraft),
      C# (Konsolen- oder Windows Form Anwendungen),
      PHP (Objektorientiert, Routing, MVC Pattern etc.),
      HTML5 (dazu gehören auch Spiele ectera)

      [ BIETE ] • Webdesigning • WBB4 • WordPress • Anpassungen für vorhandene Designs •