You are not logged in.

  • Login
Bitte besucht unser neues Forum unter https://forum.nitrado.net | Please visit our new Forum at https://forum.nitrado.net

Dear visitor, welcome to Nitrado.net Prepaid Gameserver Community-Support - Archiv. If this is your first visit here, please read the Help. It explains in detail how this page works. To use all features of this page, you should consider registering. Please use the registration form, to register here or read more information about the registration process. If you are already registered, please login here.

Phiwa

Nitrado Urgestein

  • "Phiwa" is male
  • "Phiwa" started this thread

Posts: 4,409

Thanks: 145

  • Send private message

1

Friday, November 4th 2011, 12:03pm

AntiAddict - Begrenze die Spielzeit deiner Spieler

Aufgrund von Zeitmangel bis vorraussichtlich Juni inaktiv!
Funktioniert nichtmehr mir Minecraft 1.2-Builds!

Nachdem ich gestern im Bukkitforum eine Pluginanfrage gelesen habe, welche mich fast schon gerührt hat, habe ich mich hingesetzt udn ein weiteres Plugin gebastelt.
Ich finde es schön, wenn sich Admins wirklich um ihre Spieler kümmern, deshalb präsentiere ich euch hier mein zweites Plugin "AntiAddict".
Thread im Bukkit-Forum

Features:
  • Gilt entwerder nur für festgelegte Spieler oder wahlweise für jeden Spieler (es sei denn dieser hat die Permissions-Node antiaddict.ignorelimits).
  • Timelimit und Kickmessage können in der Config gesetzt werden

Screenshots:

Was der Admin sieht:



Was der Spieler sieht:



Befehle:

  • /antiaddict <on|off>: (De)aktiviert das Plugin.
Permission-Nodes:

  • antiaddict.admin - Erlaubt es einem Spieler das Plugin zu (de)aktivieren.
Download:

Changelog


  • Neuere Versionen und ihre Changelogs sind nurnoch im Bukkitforum oder auf BukkitDev zu finden.
  • Version 1.2
    • Update auf Minecraft 1.0.1
  • Version 1.1
    • Zwei Rechtschreibfehler behoben.
  • Version 1.0
    • Initial release


Requests:



Wie immer: Wenn noch Wünsche da sind, her damit... ;)


Known Bugs:

Ebenfalls wie immer: Hoffentlich keine! Wenn doch, bitte melden.



Source



Vorab eine Bitte an Euch: Wenn ihr ein Plugin schreibt und regelmäßig eine Zeit überprüfen wollt, dann tut dies nicht im ON_PLAYER_MOVE sondern nutzt dafür den BukkitScheduler!!
Die hier genutzte Variante ist eine Eigenkreation von mir, da ich den BukkitScheduler zu diesem Zeitpunkt noch nicht kannte und zieht somit bei höheren Spielerzahlen viel zu viel Performance!!


antiaddict.java


PHP Source code

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
package phiwa.antiaddict;

import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.util.List;

import org.bukkit.ChatColor;
import org.bukkit.command.Command;
import org.bukkit.command.CommandSender;
import org.bukkit.configuration.file.FileConfiguration;
import org.bukkit.configuration.file.YamlConfiguration;
import org.bukkit.event.Event;
import org.bukkit.event.Listener;
import org.bukkit.plugin.PluginManager;
import org.bukkit.plugin.java.JavaPlugin;

import phiwa.antiaddict.listeners.players;

public class antiaddict extends JavaPlugin {
PluginManager pm;

public static boolean status true;
public static long timelimitmil;
public static long timelimit// 40.000 = 1 Sekunde
public static String limitkickmessage "Enough for today, cya tomorrow!";

public static ChatColor red ChatColor.RED;
public static ChatColor green ChatColor.GREEN;
public static ChatColor white ChatColor.WHITE;

@SuppressWarnings("rawtypes")
public static List addicts;

File configFile// Config erstellen
FileConfiguration config// "Configvariable" erstellen

@Override
public void onDisable() {

// Yamls speichern, wenn das Plugin beendet wird.
saveYamls();
System.out.println("AntiAddict has been disabled!");

}

@Override
public void onEnable() {

System.out.println("[AntiAddict] Enabling AntiAddict...");
// ////////// Alle Aktionen, die nichts mit der Config- bzw.
// Configvariablen-Initialisierung zu tun haben kommen nach ganz unten
// in dieser onEnable()-Methode ////////////

// Config-Dateien und -Variablen initialisieren...
this.configFile = new File(getDataFolder(), "config.yml");

// ...und dann die firstRun()-Methode durchlaufen lassen.
try {
this.firstRun();
} catch (Exception e) {
e.printStackTrace();
System.out
.println("[AntiAddict][Important] A serious problem occured, please contact the author of this plugin!");
}

// FileConfiguration-Variablen mithilfe der YAML-Konfiguration
// deklarieren und die "loadYamls()"-Methode nutzen.
// WICHTIG: Ohne diesen Schritt würde das Plugin die Daten aus der
// Config.yml innerhalb der JAR-Datei auslesen anstatt die richtige
// Config zu nutzen!!
this.config = new YamlConfiguration();
loadYamls();

// ////////// Alle weiteren Aktionen, die das Plugin beim aktivieren
// durchführen soll kommen unter diesen Kommentar: ////////////

System.out.println("AntiAddict has been enabled!");

Listener player = new players(this);

pm this.getServer().getPluginManager();

pm.registerEvent(Event.Type.PLAYER_JOINplayerEvent.Priority.Normal,
this);
pm.registerEvent(Event.Type.PLAYER_QUITplayerEvent.Priority.Normal,
this);
pm.registerEvent(Event.Type.PLAYER_MOVEplayerEvent.Priority.Normal,
this);
pm.registerEvent(Event.Type.PLAYER_RESPAWNplayer,
Event.Priority.Normalthis);
pm.registerEvent(Event.Type.PLAYER_BED_ENTERplayer,
Event.Priority.Normalthis);
pm.registerEvent(Event.Type.PLAYER_EGG_THROWplayer,
Event.Priority.Normalthis);
pm.registerEvent(Event.Type.PLAYER_CHATplayerEvent.Priority.Normal,
this);
pm.registerEvent(Event.Type.PLAYER_BED_LEAVEplayer,
Event.Priority.Normalthis);
pm.registerEvent(Event.Type.PLAYER_INTERACT_ENTITYplayer,
Event.Priority.Normalthis);

}

// Überprüfen, ob die Configs schon existieren, wenn nicht: Ordner und
// Config erstellen
private void firstRun() throws Exception {
if (this.configFile.exists()) // Überprüft, ob die YAML vorhanden ist
{
return;
}
System.out
.println("[AntiAddict] AntiAddict is run for the first time...");
System.out.println("[AntiAddict] No Config found!");
System.out.println("[AntiAddict] Creating default Config!");

this.configFile.getParentFile().mkdirs(); // Erstellt das Verzeichnis
// /plugins/<Pluginname>/,
// falls es nicht gefunden
// wurde
this.copy(getResource("config.yml"), this.configFile); // Kopiert den
// Inhalt der
// Config aus
// der JAR-File
// in die
// Default-Config

System.out
.println("[AntiAddict] Default Config was created successfully!");
}

// Defaults aus der Config in der JAR in die neue Config kopieren
private void copy(InputStream inFile file) {
try {
OutputStream out = new FileOutputStream(file);
byte[] buf = new byte[1024];
int len;
while ((len in.read(buf)) != -1) {
out.write(buf0len);
}
out.close();
in.close();
}

catch (Exception e) {
e.printStackTrace();
}
}

// Lädt bzw. "relädt" die Configs
public void loadYamls() {
try {
this.config.load(configFile); // Lädt die Werte der Config-Datei in
// die FileConfig-Variable
System.out
.println("[AntiAddict] Config has been loaded successfully!");

timelimit config.getInt("AntiAddict.Timelimit");
limitkickmessage config.getString("AntiAddict.LimitKickMessage");
addicts config.getList("Addicts");

timelimitmil timelimit 60000;
} catch (Exception e) {
e.printStackTrace();
System.out.println("[AntiAddict] No Config found!");
}
}

// Speichert alle FileConfig-Variablen in die Config-Datei
// Kann überall genutzt werden wo ein Wert geändert wird, sollte aber vor
// allem bei "onDisable" durchlaufen
public void saveYamls() {
try {
this.config.save(configFile); // Speichert die Werte der
// FileConfig-Variablen in die
// Config-Datei
} catch (IOException e) {
e.printStackTrace();
}
}

public boolean onCommand(CommandSender senderCommand cmd,
String commandLabelString[] args) {
if (!cmd.getName().equalsIgnoreCase("antiaddict")) {
return false;
}
if (args.length <= 0) {
this.showUsage(sender);
return false;
}
if (args[0].equalsIgnoreCase("on")) {
this.enableAntiAddict(sender);
} else if (args[0].equalsIgnoreCase("off")) {
this.disableAntiAddict(sender);
} else {
this.showUsage(sender);
}
return false;
}

private void showUsage(CommandSender sender) {
sender.sendMessage("Use:");
sender.sendMessage(red "/antiaddict on" white
" - Enables the plugin.");
sender.sendMessage(red "/antiaddict off" white
" - Disables the plugin");
}

private void enableAntiAddict(CommandSender sender) {
if (sender.hasPermission("antiaddict.admin") || sender.isOp()) {
status true;
sender.sendMessage(green "AntiAddict has been enabled!");
} else {
sender.sendMessage("You are no Admin...");
}
}

private void disableAntiAddict(CommandSender sender) {
if (sender.hasPermission("antiaddict.admin") || sender.isOp()) {
status false;
sender.sendMessage(red "Antiaddict has been disabled!");
}

else {
sender.sendMessage("You are no Admin...");
}
}

}



players.java


PHP Source code

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
package phiwa.antiaddict.listeners;

import java.util.HashMap;
import java.util.Timer;

import org.bukkit.ChatColor;
import org.bukkit.GameMode;
import org.bukkit.entity.Player;
import org.bukkit.event.player.PlayerJoinEvent;
import org.bukkit.event.player.PlayerListener;
import org.bukkit.event.player.PlayerMoveEvent;
import org.bukkit.event.player.PlayerQuitEvent;

import phiwa.antiaddict.antiaddict;

public class players extends PlayerListener

{
public static GameMode mode;

public static ChatColor red ChatColor.RED;
public static ChatColor green ChatColor.GREEN;
public static ChatColor white ChatColor.WHITE;

@SuppressWarnings("rawtypes")
public static HashMap jointimesave = new HashMap();
@SuppressWarnings("rawtypes")
public static HashMap resttimelist = new HashMap();
@SuppressWarnings("rawtypes")
public static HashMap playtimesave = new HashMap();

long jointime;
long playtime;
long currenttime;
long playtimeold;

Timer timer = new Timer();

antiaddict plugin;

public players(antiaddict plugin) {
this.plugin plugin;
}

@SuppressWarnings("unchecked")
public void onPlayerJoin(PlayerJoinEvent event) {

Player player event.getPlayer();
String playername player.getName();

if (antiaddict.addicts.contains(playername)) {

jointime System.currentTimeMillis();

jointimesave.put(playernamejointime);

if (antiaddict.status == true) {

System.out.println("[AntiAddict] The player " playername
" just logged in.");
System.out
.println("[AntiAddict] He was marked as addicted, so his playtime");
System.out.println("[AntiAddict] is restricted to "
antiaddict.timelimit " minutes.");
player.sendMessage("[AntiAddict] Your playtime is limited to " +antiaddict.timelimit" minutes.");

}
}

}

@SuppressWarnings("unchecked")
public void onPlayerQuit(PlayerQuitEvent event) {

Player player event.getPlayer();
String playername player.getName();

if (antiaddict.status == true
&& antiaddict.addicts.contains(playername)) {

playtimesave.put(playernameplaytime);

}

}

@SuppressWarnings("unchecked")
public void onPlayerMove(PlayerMoveEvent event) {

Player player event.getPlayer();
String playername player.getName();

if (antiaddict.status == true
&& antiaddict.addicts.contains(playername)) {

currenttime System.currentTimeMillis();
jointime = (Longjointimesave.get(playername);
try {
playtimeold = (Longplaytimesave.get(playername);
} catch (NullPointerException nfe) {
playtimesave.put(playername0L);
playtimeold = (Longplaytimesave.get(playername);
}

playtime playtimeold + (currenttime jointime);
long resttime antiaddict.timelimitmil playtime;

resttimelist.put(playernameresttime);

if (resttime <= 0) {
player.kickPlayer(antiaddict.limitkickmessage);

System.out
.println("[AntiAddict] "
playername
" reached his daily limit and was kicked into RL again.");
}

}
}

}



This post has been edited 14 times, last edit by "Phiwa" (Mar 12th 2012, 10:50pm)


ronyzzn

User / Kunde

  • "ronyzzn" is male

Posts: 1,721

Occupation: FISI Azubi

Thanks: 21

  • Send private message

2

Friday, November 4th 2011, 3:09pm

Hi Phiwa ,

ich finde das Plugin schonmal echt gut :thumbup: . Ich kann es mir leider nicht anschaun aber denke mal das es perect ist ;) .

Und Herzlichen Glückwunsch zum Plugin Developer auch auf den Bukkit-Foren :vain: .

Vlt. sollte noch hinzu kommen , das man es ingame steuern kann.Damit miene ich z.b die playtime für spieler umstellen kann.

Phiwa

Nitrado Urgestein

  • "Phiwa" is male
  • "Phiwa" started this thread

Posts: 4,409

Thanks: 145

  • Send private message

3

Friday, November 4th 2011, 3:09pm

Update auf v1.1:

Changelog:
  • Zwei Rechtschreibfehler behoben.

TheHarofreak

User / Kunde

  • "TheHarofreak" is male

Posts: 1,488

Location: NRW

Occupation: Dualer IT Student

Thanks: 109

  • Send private message

4

Friday, November 4th 2011, 3:11pm

Auch nicht schlecht so ein Plugin :D

Gute Idee. Auch von mir nochmal Herzlichen Glückwunsch zum Plugin Developer ;)


Phiwa

Nitrado Urgestein

  • "Phiwa" is male
  • "Phiwa" started this thread

Posts: 4,409

Thanks: 145

  • Send private message

5

Friday, November 4th 2011, 3:12pm

Danke, den Titel habe ich aber für Mortar bekommen, nicht für das Zeugs hier. :P

Aktuell ist es noch nicht wirklich CPU-freundlich, deshalb mag Marcel es glaube ich nicht. ^^
Ich versuche das noch zu ändern, aber dafür muss ich das Plugin fast komplett neu schreiben... ;(

ronyzzn

User / Kunde

  • "ronyzzn" is male

Posts: 1,721

Occupation: FISI Azubi

Thanks: 21

  • Send private message

6

Friday, November 4th 2011, 3:18pm

Quoted

Ich versuche das noch zu ändern, aber dafür muss ich das Plugin fast komplett neu schreiben... ;(


hmm... das ist natürlich :shit: . Ich denke das Marcel es mögen wird :D Dann verbringt er bestimmt auch mal mehr Zeit mit Real-Life :phat: (nicht böse gemeint :rolleyes: )

EDIT:

Mir fällt grade noch ein , dass du vlt. aliases machen kannst für tippfaule wie mich :D

This post has been edited 1 times, last edit by "ronyzzn" (Nov 4th 2011, 3:36pm)


THEEX

Moderator im Ruhestand

  • "THEEX" is male

Posts: 3,242

Location: Saarland

Occupation: Ist das wichtig?

Thanks: 8

  • Send private message

7

Friday, November 4th 2011, 6:14pm

Hmmm, kann man in Java keine Delays einfügen? Ich kenne das zumindest von einer anderen Programmiersprache, daß man so Ressourcen schonen kann.
mal wieder da

85.131.149.85:28015 [Ger] Rust Oxide - Testgelaende - kein Spielplatz

Phiwa

Nitrado Urgestein

  • "Phiwa" is male
  • "Phiwa" started this thread

Posts: 4,409

Thanks: 145

  • Send private message

8

Friday, November 4th 2011, 10:58pm

Kann man, aber die normale jTask-Funktion sollte man nicht nutzen, sondern nur die Bukkit-eigene und die wollte letzte Nacht nicht.
Ich schreibs nochal neu sobald ich Zeit habe, aber Xems und ich haben und gesagt, dass dieses Plugin auf einem Server eigentlich nur für eine handvoll Spieler aktiviert wird und das ist dem Server dann ziemlich egal...
Leider habe ich ab heute Abend für ein paar Tage keinen PC (gehe ich erstmal von aus) und keine Zeit, weshalb ich mich nächste/übernächste Woche ans umschreiben setze.
Der Ersteller des Plugin-Request wollte ich nicht so lange warten lassen und für ihn reicht die aktuelle Version auch aus.
Wollte das Plugin nur veröffentlichen bevor jemand anders meine vorläufige JAR decompiled und selber released, man weiß ja nie. ;)

EDIT: @ronyzzn: Wäre es ein Command, den man häufig eingeben muss, würde ich das tun.
Aber ich sehe nicht wieso es bei diesem Plugin sinnvoll sein sollte. Du willst vielleicht einmal im Monat bei nem Event oder so kurzfristig Spielern erlauben länger zu spielen. Solltest du sowas im voraus wissen würdest du das Plugin ja einfach kurz in nen anderen Ordner verschieben damit es nicht geladen wird. ;)

This post has been edited 1 times, last edit by "Phiwa" (Nov 4th 2011, 11:06pm)


.:Xenon:.

User / Kunde

  • ".:Xenon:." is male

Posts: 2,054

Location: Bonn

Occupation: Badewannenhersteller

  • Send private message

9

Friday, November 4th 2011, 11:35pm

Kann man also z.B. von nervigen Quälgeistern die maximale Spieldauer pro Tag auf 1 Stunde setzen? :D

Phiwa

Nitrado Urgestein

  • "Phiwa" is male
  • "Phiwa" started this thread

Posts: 4,409

Thanks: 145

  • Send private message

10

Friday, November 4th 2011, 11:51pm

Jop. ;)
In der aktuellen Version kann man festlegen für welche Spieler die Beschränkung gilt, aber noch keine individuelle Dauer pro Spieler.

.:Xenon:.

User / Kunde

  • ".:Xenon:." is male

Posts: 2,054

Location: Bonn

Occupation: Badewannenhersteller

  • Send private message

11

Saturday, November 5th 2011, 12:09am

Es wäre für die Zukunft vielleicht noch besser, wenn man nicht pro Spieler die Beschränkung einstellt, sondern den Kram über Permissions regelt. ;)

Phiwa

Nitrado Urgestein

  • "Phiwa" is male
  • "Phiwa" started this thread

Posts: 4,409

Thanks: 145

  • Send private message

12

Saturday, November 5th 2011, 1:11pm

So wars am Anfang, aber das fand ich irgendwie nicht so pralle...
Wenns ne Permission ist, dann muss man erstmal gucken, dass man sie dem Admin entzieht, weil der sonst auch gekickt wird.
Außerdem weiß ich nicht, wie ich da individuelle Zeiten einbauen sollte, weil ich nicht weiß wie man bei Nodes wie aa.aadict.5 die 5 ausliest. o.O
Ein weiteres Problem ist, dass in der aktuellen Version möglichst wenig Spieler beschränkt werden sollten, da jeder Spieler mehr die CPU belastet (und das wie gesagt nicht gerade wenig für so ein kleines Plugin) und wenn man mit einem Schlag ner ganzen Gruppe die Prmissions geben kan, dann kommen erheblich schneller Lags auf...

.:Xenon:.

User / Kunde

  • ".:Xenon:." is male

Posts: 2,054

Location: Bonn

Occupation: Badewannenhersteller

  • Send private message

13

Saturday, November 5th 2011, 1:22pm

Wenns ne Permission ist, dann muss man erstmal gucken, dass man sie dem Admin entzieht,

Dann mach es doch andersherum. :P
Diejenigen, welche die Permission haben dürfen bleiben, die anderen kriegen den tritt nach draußen. :D

Irgendwie wirst du bestimmt auch noch hinkriegen, dass die CPU nicht überlastet wird. Ich glaub' da an dich. :P

XemsDoom

Unregistered

14

Saturday, November 5th 2011, 2:25pm

Good Job. ;)
Was haste dann für ne sache gemacht,
dass das Ding so CPU-Fressend sein sollte?

This post has been edited 1 times, last edit by "XemsDoom" (Nov 5th 2011, 2:34pm)


Phiwa

Nitrado Urgestein

  • "Phiwa" is male
  • "Phiwa" started this thread

Posts: 4,409

Thanks: 145

  • Send private message

15

Saturday, November 5th 2011, 3:10pm

So ziemlich das, was du ebenfalls vorgeschlagen hast. ;)
onPlayerMove, bei 20-30 Checks/(Sekunde und Spieler) zieht das bei vielen Spielern schon ganz gut glaube ich, aber der BukkitScheduler wollte nicht.

Btw. ich habe in der Nacht bis 3:00 die Version bei der er die Spielzeit hochzählt getestet und hatte ja je nach Zeitlimit ziemliche Randomtimes nach denen ich gekickt wurde, keine Ahnugn warum.
Habe dann diese Version genutzt, die die verbleibende Zeit runterzählt und die funktioniert auf die Sekunde genau, nur das CPU-Problem bleibt. :p

Ich werde mal sehen, dass ich mir den BukkitSchdeuler reinziehe sobald ich wieder meinen richtigen Rechner und ein bisschen Zeit habe.

XemsDoom

Unregistered

16

Saturday, November 5th 2011, 3:22pm

Ich habe dir vorgeschlagen bei sachlichen Events die Sachen zu checken,
dass mit onPlayerMove war nicht ernst gemeint.
Wie wärs mit onPlayerInventory/onPlayerSpawn/onPlayerRespawn.
Die schlagen sehr wahrscheinlich genug an um eine volle check Summe zu erreichen.

Phiwa

Nitrado Urgestein

  • "Phiwa" is male
  • "Phiwa" started this thread

Posts: 4,409

Thanks: 145

  • Send private message

17

Saturday, November 5th 2011, 5:42pm

Glaub ich nicht...
Spawn und Respawn können Stunden auseinanderliegen, nur Inventory wäre sinnvoll.
Ein vernünftiges Timign der checks finde ich trotzdem besser, aber dafür muss ich mir den Scheduler nochmal angucken...

Nolig

User / Kunde

  • "Nolig" is male
  • "Nolig" has been banned

Posts: 1,630

Thanks: 8

  • Send private message

18

Saturday, November 19th 2011, 9:11pm

Ich kann dir gerne helfen.
BukkitScheduler habe ich gerade erst in mein neues Plugin eingebaut:
<3 Das Banner :D
Und ja wenn du Hilfe brauchst meld dich !
Skype: kano10000
Warum stammeln in den Foren so viele Leute wirres Zeug wie „na dat doch volkom klar“? Weil es offenbar "cool" ist, sich als total bescheuert zu outen und die PISA-Studie zu untermauern!
Etwas kann Sinn ergeben oder Sinn stiftenSinn machen ist jedoch nicht sinnvoll!

Kugelhai

User / Kunde

Posts: 200

Location: Mönchengladbach

Occupation: Schüler

  • Send private message

19

Sunday, November 20th 2011, 10:49am

Phiwa? Wo hast du das Plugin scripten gelernt?

Phiwa

Nitrado Urgestein

  • "Phiwa" is male
  • "Phiwa" started this thread

Posts: 4,409

Thanks: 145

  • Send private message

20

Sunday, November 20th 2011, 11:39am

Zwei Wochen Java-Tutorials und dann einen Abend mit XemsDoom via Skype.
Du brauchst nur jemanden, der dir ein paar wichtige Aspekte erklärt, die du bei Bukkit zusätzlich beachten musst, dann klappt der Rest. ;)

Bitte besucht unser neues Forum unter https://forum.nitrado.net| Please visit our new Forum at https://forum.nitrado.net