getDependencies() {
+ return Collections.unmodifiableList(dependencies);
+ }
+ }
+}
diff --git a/src/net/mosstest/client/messages.properties b/src/net/mosstest/client/messages.properties
new file mode 100644
index 0000000..3867b7b
--- /dev/null
+++ b/src/net/mosstest/client/messages.properties
@@ -0,0 +1,20 @@
+IOEXCEPTION_DESERIALIZE_AUTH_PCKT=IOException deserializing an authentication packet, or sending its reply.
+IOEXCEPTION_DESERIALIZE_AUTH_FAIL_PCKT=IOException deserializing an authentication failure packet, or sending its reply.
+AUTH_FAILED_UNKNWN=Authentication failed for an unknown reason
+AUTH_FAILED_BAD_PASS=Authentication failed due to a bad password.
+AUTH_FAILED_BAN=You are banned.
+AUTH_FAILED_PLAYER_LIM=The server is at its player limit; no more players can join.
+AUTH_FAILED_LOGON_HOUR=A server reports a logon hour restriction. The meaning of this may depend as Mosstest does not use this type of failure in its default implementation
+AUTH_FAILED_NO_REGISTER=The server is not allowing new players to register.
+AUTH_FAILED_VERSION=The server and client versions do not match and no common version can be negotiated upon.
+AUTH_FAILED_TIMEOUT=Authentication has timed out
+AUTH_FAILED_MAINTENANCE=The server is undergoing maintenance. Generally, only administrators can join in such a case
+AUTH_FAILED_CONN=The connection failed; cannot authenticate
+ALREADY_AUTHED=Server request authentication, but we've already authenticated. Throwing away request for security.
+SVR_NO_AUTH=Server is not using authentication...
+SVR_AUTH_PLAIN=Server is requesting password in plain text.
+SERVER_AUTH_CHALLENGE_RESP=Challenge-response authentication is not supported at this time.
+AUTH_CHAP_FAILED=Challenge-Response auth unsupported
+MALFORMED_TC_AUTH_REQUESTED=Malformed TOCLIENT_AUTH_REQUESTED packet.
+PACKET_NOT_DISPATCHABLE=Received a packet that cannot be dispatched at this time.
+AUTH_FAIL_EXCEPTION=Server denied authentication; client cannot continue
\ No newline at end of file
diff --git a/src/net/mosstest/launcher/messages_it.properties b/src/net/mosstest/launcher/messages_it.properties
new file mode 100644
index 0000000..baaeb03
--- /dev/null
+++ b/src/net/mosstest/launcher/messages_it.properties
@@ -0,0 +1,51 @@
+GUIBugReportDialog.DLG_BUG_DESC=Descrizione dettagliata del problema\:
+GUIBugReportDialog.DLG_BUG_DESC_DEFAULT=Per favore descrivete qui il vostro problema, preferibilmente includendo quello che vi aspettavate che succedesse, che cosa \u00E8 successo, e qualsiasi altro dettaglio riguardante il mondo o il gioco.\n\nPer favore tenete presente che non possiamo aiutarvi con giochi o mod di terze parti.
+GUIBugReportDialog.DLG_BUG_EMAIL=e-mail (facoltativa)\:
+GUIBugReportDialog.DLG_BUG_NAME=Nome\:
+GUIBugReportDialog.DLG_BUG_SUMMARY=Riassunto del problema\:
+GUIBugReportDialog.DLG_BUG_TITLE=Segnalare un bug
+GUIBugReportDialog.DLG_CHECKBOX_INCLUDE_TECH_INFO=Includere informazioni tecniche
+GUIBugReportDialog.DLG_CXL=Annullare
+GUIBugReportDialog.DLG_OK=OK
+GUIBugReportDialog.DLG_SUBMIT=Inviare
+GUIBugReportDialog.NOTICE_INFO_INCLUDED=Se questa casella viene marcata verranno aggiunte alla segnalazione del bug le seguenti informazioni\: \n\n
+GUIClientsideLauncher.23=Segnalare un bug...
+GUIClientsideLauncher.24=Richiedere una caratteristica nuova...
+GUIClientsideLauncher.25=Visitare il sito web
+GUIClientsideLauncher.26=Progetto GitHub
+GUIClientsideLauncher.27=Visitare i forum
+GUIClientsideLauncher.COL_GAME_PRESET=Gioco preimpostato
+GUIClientsideLauncher.COL_WORLD_DESC=Descrizione
+GUIClientsideLauncher.COL_WORLD_NAME=Nome del mondo
+GUIClientsideLauncher.DLG_ABOUT=Informazioni
+GUIClientsideLauncher.DLG_DELETE=Cancellare...
+GUIClientsideLauncher.DLG_NEW=Nuovo...
+GUIClientsideLauncher.DLG_NO_WORLD_TO_DELETE=Non \u00E8 stato scelto nessun mondo da cancellare. Per favore selezionate un mondo esistente nella tabella.
+GUIClientsideLauncher.DLG_PLAY=Giocare
+GUIClientsideLauncher.DLG_SETTINGS=Impostazioni...
+GUIClientsideLauncher.DLG_SINGLEPLAYER=Giocatore singolo
+GUIClientsideLauncher.DLG_TITLE=Avviatore del Client Mosstest <0.0.1-initial>
+GUIClientsideLauncher.ERR_NO_WORLD_SELECTED=Non \u00E8 stato selezionato nessun mondo da avviare. Per favore selezionate un mondo esistente nella tabella, o create un mondo nuovo.
+GUIClientsideLauncher.ERR_NO_WORLD_SELECTED_TITLE=Nessun mondo selezionato
+GUIClientsideLauncher.NOTICE_DEFAULT_GAME_CODE=Il codice e le immagini predefinite del gioco sono state create da dolinksy296, hexafraction, e altri.\n
+GUIClientsideLauncher.NOTICE_PRIMARY_AUTHORS=Creato da hexafraction, thatnerd2, e altri.\n
+GUIClientsideLauncher.NOTICE_TOOLS_USED=Creato con l'aiuto di Eclipse, Git, Maven e innumerevoli servizi come TravisCI e GitHub.\n
+GUIClientsideLauncher.SYS_NEWLINE=\n
+GUIClientsideLauncher.USES_LIBS=Utilizza le librerie seguenti\:\n
+GUIClientsideLauncher.WARN_SET_LAF=Avviso\: l'aspetto non pu\u00F2 essere applicato al sistema. Si utilizza l'aspetto predefinito.
+GUIWorldCreationDialog.CXL=Annullare
+GUIWorldCreationDialog.DLG_TITLE=Creare un nuovo mondo per giocatore singolo...
+GUIWorldCreationDialog.GAME_PROFILE=Profilo di gioco\:
+GUIWorldCreationDialog.OK=OK
+GUIWorldCreationDialog.WORLD_DESC=Descrizione\:
+GUIWorldCreationDialog.WORLD_NAME=Nome del mondo\:
+GUIWorldDeletionDialog.AREYOUSURE_TEXT=Siete certi di volere cancellare {0}? Ci\u00F2 non pu\u00F2 essere annullato.
+GUIWorldDeletionDialog.DLG_TITLE=Cancellare un mondo per giocatore singolo...
+GUIWorldDeletionDialog.NO=No
+GUIWorldDeletionDialog.QUESTIONMARK_CANNOT_UNDO=? Questa operazione non pu\u00F2 essere annullata.
+GUIWorldDeletionDialog.YES=S\u00EC
+GAMEPLAY_NO_WORLD=Si \u00E8 tentato di avviare il gioco senza selezionare un mondo.
+GAME_UNCAUGHT_EXCEPT=Eccezione non notata nel codice del gioco, apertura del segnalatore di bug.
+STACKTRACE_WRITTEN=Lo stack trace \u00E8 stato scritto su {0}
+WORLD_CREATION_CXLD=Creazione del mondo annullata
+NO_WORLD_TO_DELETE=Si \u00E8 tentato di cancellare un mondo, ma non ne \u00E8 stato selezionato nessuno.
diff --git a/src/net/mosstest/servercore/netcommand/MalformedPacketException.java b/src/net/mosstest/netcommand/MalformedPacketException.java
similarity index 67%
rename from src/net/mosstest/servercore/netcommand/MalformedPacketException.java
rename to src/net/mosstest/netcommand/MalformedPacketException.java
index 2ce4194..5d5583f 100644
--- a/src/net/mosstest/servercore/netcommand/MalformedPacketException.java
+++ b/src/net/mosstest/netcommand/MalformedPacketException.java
@@ -1,4 +1,4 @@
-package net.mosstest.servercore.netcommand;
+package net.mosstest.netcommand;
/**
* The Class MalformedPacketException.
diff --git a/src/net/mosstest/netcommand/ToClientAuthDenied.java b/src/net/mosstest/netcommand/ToClientAuthDenied.java
new file mode 100644
index 0000000..2d629d0
--- /dev/null
+++ b/src/net/mosstest/netcommand/ToClientAuthDenied.java
@@ -0,0 +1,113 @@
+package net.mosstest.netcommand;
+
+import java.io.*;
+
+/**
+ * Created by hexafraction on 5/3/14.
+ */
+public class ToClientAuthDenied extends ToClientCommand {
+ public enum DenyReason {
+ REASON_UNKNWN,
+ REASON_BAD_PASS,
+ REASON_BANNED,
+ REASON_PLAYER_LIMIT,
+ REASON_LOGON_HOUR,
+ REASON_NO_NEW_PLAYERS,
+ REASON_VERSION_MISMATCH,
+ REASON_AUTH_TIMED_OUT,
+ REASON_SERVER_MAINT,
+ REASON_FAILED_CONNECTION
+ }
+
+ public DenyReason getReason() {
+ return reason;
+ }
+
+ private final DenyReason reason;
+
+ public ToClientAuthDenied(DenyReason reason) {
+ this.reason = reason;
+ }
+
+ public ToClientAuthDenied(byte[] buf) throws IOException {
+ ByteArrayInputStream bs = new ByteArrayInputStream(buf);
+ DataInputStream ds = new DataInputStream(bs);
+ int reason_ = ds.readUnsignedByte();
+ switch(reason_){
+ case 0x01:
+ this.reason = DenyReason.REASON_BAD_PASS;
+ break;
+ case 0x02:
+ this.reason = DenyReason.REASON_BANNED;
+ break;
+ case 0x03:
+ this.reason = DenyReason.REASON_PLAYER_LIMIT;
+ break;
+ case 0x04:
+ this.reason = DenyReason.REASON_LOGON_HOUR;
+ break;
+ case 0x05:
+ this.reason = DenyReason.REASON_NO_NEW_PLAYERS;
+ break;
+ case 0x06:
+ this.reason = DenyReason.REASON_PLAYER_LIMIT;
+ break;
+ case 0x07:
+ this.reason = DenyReason.REASON_VERSION_MISMATCH;
+ break;
+ case 0x08:
+ this.reason = DenyReason.REASON_AUTH_TIMED_OUT;
+ break;
+ case 0x09:
+ this.reason = DenyReason.REASON_SERVER_MAINT;
+ break;
+ case 0x0a:
+ this.reason = DenyReason.REASON_FAILED_CONNECTION;
+ break;
+ // fall through for unknwn
+ case 0x00:
+ default:
+ this.reason = DenyReason.REASON_UNKNWN;
+
+ }
+ }
+
+ public byte[] toByteArray() throws IOException {
+ ByteArrayOutputStream bos = new ByteArrayOutputStream();
+ DataOutputStream dos = new DataOutputStream(bos);
+ switch (this.reason) {
+
+ case REASON_UNKNWN:
+ dos.writeByte(0x00);
+ break;
+ case REASON_BAD_PASS:
+ dos.writeByte(0x01);
+ break;
+ case REASON_BANNED:
+ dos.writeByte(0x02);
+ break;
+ case REASON_PLAYER_LIMIT:
+ dos.writeByte(0x03);
+ break;
+ case REASON_LOGON_HOUR:
+ dos.writeByte(0x04);
+ break;
+ case REASON_NO_NEW_PLAYERS:
+ dos.writeByte(0x06);
+ break;
+ case REASON_VERSION_MISMATCH:
+ dos.writeByte(0x07);
+ break;
+ case REASON_AUTH_TIMED_OUT:
+ dos.writeByte(0x08);
+ break;
+ case REASON_SERVER_MAINT:
+ dos.writeByte(0x09);
+ break;
+ case REASON_FAILED_CONNECTION:
+ dos.writeByte(0x0a);
+ break;
+ }
+ return bos.toByteArray();
+ }
+}
diff --git a/src/net/mosstest/servercore/netcommand/ToClientAuthRequested.java b/src/net/mosstest/netcommand/ToClientAuthRequested.java
similarity index 92%
rename from src/net/mosstest/servercore/netcommand/ToClientAuthRequested.java
rename to src/net/mosstest/netcommand/ToClientAuthRequested.java
index b6d800d..a0d77a3 100644
--- a/src/net/mosstest/servercore/netcommand/ToClientAuthRequested.java
+++ b/src/net/mosstest/netcommand/ToClientAuthRequested.java
@@ -1,5 +1,5 @@
//just keep the same package and import lines
-package net.mosstest.servercore.netcommand;
+package net.mosstest.netcommand;
import java.io.*;
@@ -26,7 +26,7 @@ public class ToClientAuthRequested extends ToClientCommand {
/**
* The Enum AuthType.
*/
- enum AuthType {
+ public enum AuthType {
/**
* The auth nil.
@@ -144,4 +144,12 @@ public class ToClientAuthRequested extends ToClientCommand {
//Use this line at the end to finish up
return bos.toByteArray();
}
+
+ public AuthType getAuthType() {
+ return authType;
+ }
+
+ public byte[] getAuthParam() {
+ return authParam;
+ }
}
diff --git a/src/net/mosstest/servercore/netcommand/ToClientCommand.java b/src/net/mosstest/netcommand/ToClientCommand.java
similarity index 63%
rename from src/net/mosstest/servercore/netcommand/ToClientCommand.java
rename to src/net/mosstest/netcommand/ToClientCommand.java
index f3ec40d..31e2c2e 100644
--- a/src/net/mosstest/servercore/netcommand/ToClientCommand.java
+++ b/src/net/mosstest/netcommand/ToClientCommand.java
@@ -1,4 +1,4 @@
-package net.mosstest.servercore.netcommand;
+package net.mosstest.netcommand;
/**
* The Class ToClientCommand.
diff --git a/src/net/mosstest/netcommand/ToServerCommand.java b/src/net/mosstest/netcommand/ToServerCommand.java
new file mode 100644
index 0000000..bf6a3c9
--- /dev/null
+++ b/src/net/mosstest/netcommand/ToServerCommand.java
@@ -0,0 +1,10 @@
+package net.mosstest.netcommand;
+
+/**
+ * The Class ToServerCommand.
+ */
+public abstract class ToServerCommand {
+
+ //ignore
+
+}
diff --git a/src/net/mosstest/netcommand/ToServerHello.java b/src/net/mosstest/netcommand/ToServerHello.java
new file mode 100644
index 0000000..7647cba
--- /dev/null
+++ b/src/net/mosstest/netcommand/ToServerHello.java
@@ -0,0 +1,43 @@
+package net.mosstest.netcommand;
+
+import java.io.*;
+
+/**
+ * Created by hexafraction on 4/27/14.
+ */
+public class ToServerHello {
+ private final String username;
+ private final int protocolVersion;
+ private final int minScriptApi;
+ private final int maxScriptApi;
+
+ public ToServerHello(byte[] buf) throws IOException,
+ MalformedPacketException {
+
+ // constructor from byte[] is parsing
+ // Keep lines below for all of these tasks
+ ByteArrayInputStream bs = new ByteArrayInputStream(buf);
+ DataInputStream ds = new DataInputStream(bs);
+ this.protocolVersion = ds.readUnsignedShort();
+ this.minScriptApi = ds.readUnsignedShort();
+ this.maxScriptApi = ds.readUnsignedShort();
+ this.username = ds.readUTF();
+ }
+
+ public ToServerHello(String username, int protocolVersion, int minScriptApi, int maxScriptApi) {
+ this.username = username;
+ this.protocolVersion = protocolVersion;
+ this.minScriptApi = minScriptApi;
+ this.maxScriptApi = maxScriptApi;
+ }
+
+ public byte[] toByteArray() throws IOException {
+ ByteArrayOutputStream bos = new ByteArrayOutputStream();
+ DataOutputStream dos = new DataOutputStream(bos);
+ dos.writeShort(this.protocolVersion);
+ dos.writeShort(this.minScriptApi);
+ dos.writeShort(this.maxScriptApi);
+ dos.writeUTF(this.username);
+ return bos.toByteArray();
+ }
+}
\ No newline at end of file
diff --git a/src/net/mosstest/scripting/MossScriptEnv.java b/src/net/mosstest/scripting/MossScriptEnv.java
index afcbf66..360ad23 100644
--- a/src/net/mosstest/scripting/MossScriptEnv.java
+++ b/src/net/mosstest/scripting/MossScriptEnv.java
@@ -1,3 +1,4 @@
+<<<<<<< HEAD
package net.mosstest.scripting;
import net.mosstest.scripting.events.IMossEvent;
@@ -341,3 +342,362 @@ public class MossScriptEnv {
}
}
+=======
+package net.mosstest.scripting;
+
+import net.mosstest.scripting.events.IMossEvent;
+import net.mosstest.scripting.handlers.MossEventHandler;
+import net.mosstest.scripting.handlers.MossNodeChangeHandler;
+import net.mosstest.servercore.*;
+import org.jetbrains.annotations.NonNls;
+
+import java.util.ArrayList;
+import java.util.Collections;
+import java.util.HashMap;
+import java.util.List;
+
+/**
+ * This class is used by scripts and script-facing portions of Mosstest. Methods
+ * restricted to be called from trusted Java-side shall pass a
+ * {@link ScriptSandboxBorderToken}. Each event fired will run in the thread
+ * pool. All requests via this API need not concern themselves with threading as
+ * everything is handled by Mosstest itself.
+ *
+ * The event handlers called are the ones defined via this class's registerOnFoo
+ * methods, followed by any handlers defined in an instance of NodeParams via an
+ * anonymous inner class, and finally with the default handler.
+ *
+ * The order in which handlers registered here are called is undefined due to
+ * the undefined order of scripts being loaded. Generally, this is planned to
+ * occur in an order based on the SHA512 hash of the script. Comments with dummy
+ * information may be used by the script author to attempt to set the position
+ * of a script in the execution order via manipulating the hash. Handlers of the
+ * same types within the same script are guaranteed to be called in order.
+ *
+ * An event handler may interrupt handling of the event so that no further event
+ * handlers nor the default are ever called, by returning the proper boolean value
+ *
+ * @author rarkenin
+ * @version 0.0
+ * @since 0.0
+ */
+public class MossScriptEnv {
+ public static final short SCRIPT_API_VERSION = 1;
+ public static final short MIN_SCRIPT_API_VERSION = 1;
+ public static final short MAX_SCRIPT_API_VERSION = 1;
+ public void registerNodeChangeHandler(MossNodeChangeHandler h) {
+
+ }
+
+ private InheritableThreadLocal requestedScriptApiVer = new InheritableThreadLocal(){
+ @Override
+ protected Short initialValue() {
+ return MAX_SCRIPT_API_VERSION;
+ }
+ };
+
+ public void setRequestedScriptApiVer(short requestedScriptApiVer) {
+ if(requestedScriptApiVer >= MIN_SCRIPT_API_VERSION && requestedScriptApiVer <= MAX_SCRIPT_API_VERSION)
+ this.requestedScriptApiVer.set(requestedScriptApiVer);
+ else {
+ throw new MosstestFatalDeathException("A plugin requests an unsatisfiable script API version.");
+ }
+ }
+
+ private HashMap, ArrayList> eventHandlers;
+
+ private ScriptableDatabase db;
+
+ private MapCache nc;
+
+ private FuturesProcessor fp;
+
+ private INodeManager nm;
+
+
+ /**
+ * Sends a chat message to a player.
+ *
+ * @param recipient A {@link Player} object representing the recipient. A Player
+ * object may be constructed with
+ * {@link MossScriptEnv#getPlayerByName(String)}.
+ * @param from A player object representing the sender. A Player object may
+ * be constructed with
+ * {@link MossScriptEnv#getPlayerByName(String)}. If null a
+ * message is sent showing to users as having been sent by the
+ * server with the prefix [*] Server:
+ * @param message A string representing the message that shall be sent to the
+ * specified recipient.
+ */
+ public void sendChatMessage(Player recipient, Player from, String message) {
+ // TODO
+ }
+
+ /**
+ * Sends a chat message to all players.
+ *
+ * @param from A player object representing the sender. A Player object may
+ * be constructed with
+ * {@link MossScriptEnv#getPlayerByName(String)}. If null a
+ * message is sent showing to users as having been sent by the
+ * server with the prefix [*] Server:
+ * @param message A string representing the message that shall be sent to the
+ * specified recipient.
+ */
+ public void sendChatAll(Player from, String message) {
+ // TODO
+ }
+
+ /**
+ * Sets the health on an entity or player.
+ *
+ * @param p The player to set health on.
+ * @param health A positive integer representing the amount of health to set.
+ */
+ public void setHp(Player p, int health) {
+ // TODO Once we have players doing stuff
+ }
+
+ /**
+ * Damages the tool of a player corresponding to a dig. The player's
+ * currently selected tool is damaged.
+ *
+ * @param actor The player that is digging a node.
+ * @param nd The node dug.
+ * @throws MossScriptException Thrown if the current tool cannot be used to dig the node.
+ */
+ public void damageTool(Player actor, MapNode nd) throws MossScriptException {
+ // TODO Auto-generated method stub
+
+ }
+
+ /**
+ * Gives a player an item. The item stack will be added to the player's
+ * default inventory, adding to the first available partial stack. If no
+ * partial stacks are available the item is added to the first open slot in
+ * the inventory.
+ *
+ * @param player the player
+ * @param item the item
+ * @return True if the item could be added, false if the item could not be
+ * added due to insufficient space.
+ */
+ public boolean givePlayer(Player player, MossItem.Stack item) {
+ MossInventory mi = player.getInventory("default", 4, 8, 128);
+
+ // use side effect
+ return (mi.addItem(item) == item.amount);
+
+ }
+
+ /**
+ * Sets a node of the world to a given type. This cannot be called on a
+ * NodePosition with an existing solid node; use
+ * {@link #removeNode(NodePosition)} first.
+ *
+ * @param pos The position at which to set a node.
+ * @param node The node to place at that position.
+ */
+ public void setNode(NodePosition pos, MapNode node) throws MapGeneratorException {
+ MapChunk chk = this.nc.getChunkNoGenerate(pos.chunk);
+ if (chk == null)
+ return;
+ if (!(this.nm.containsNode(node) || node instanceof IDynamicNode))
+ throw new IllegalArgumentException("The mapnode passed is not contained in the world node manager");
+
+ chk.setNode(pos.xl, pos.yl, pos.zl, node.getNodeId());
+ }
+
+ /**
+ * Removes a node, setting it to air. This may be called on a NodePosition
+ * with an existing solid node.
+ *
+ * @param pos The NodePosition at which to remove the node.
+ */
+ public void removeNode(NodePosition pos) throws MapGeneratorException {
+ MapChunk chk = this.nc.getChunkNoGenerate(pos.chunk);
+ if (chk == null)
+ return;
+ chk.setNode(pos.xl, pos.yl, pos.zl, this.nm.getNode("mg:air") //$NON-NLS-1$
+ .getNodeId());
+ this.nc.setChunk(pos.chunk, chk);
+ }
+
+ /**
+ * Get the MapNode at a certain location.
+ *
+ * @param pos The location at which to get the node
+ * @return A MapNode object representing the node at that location.
+ * @throws MapGeneratorException the map generator exception
+ */
+ public MapNode getNode(NodePosition pos) throws MapGeneratorException {
+ return this.nm.getNode((short) this.nc.getChunk(pos.chunk).getNodeId(
+ pos.xl, pos.yl, pos.zl));
+
+ }
+
+ /**
+ * Registers a mapnode in the world, allowing it to be placed.
+ *
+ * @param nd
+ * @throws MossWorldLoadException
+ */
+ public void registerNode(MapNode nd) throws MossWorldLoadException {
+ this.nm.putNode(nd);
+ }
+
+ /**
+ * Register a new liquid in the node manager, generating intermediates as needed.
+ *
+ * @param sysname The name such as default:lava to set. The prefix mg: is used
+ * for mapgen-specific nodes, and should be done by creating a
+ * node with a different prefix and aliasing mg:foo to it.
+ * @param userFacingName The name to display in the UI, such as Lava or Iron Ore
+ * @param params An implementation of the {@link LiquidNodeParams} interface
+ * detailing the action of the node. {@link LiquidSourceNodeParams} and
+ * {@link LiquidFlowingNodeParams} are valid for liquid sources and flowing liquid nodes,
+ * respectively.
+ * @param flowParams the source params
+ * @param textures A string stating the filename of the textures image.
+ * @param light The amount of light from 0 to 255 to be emitted.
+ * @return The MapNode object that has been created and added to the
+ * manager.
+ * @throws MossWorldLoadException If an exception occurs during the execution of the
+ * registering.
+ */
+ public LiquidNode registerLiquid(@NonNls String sysname, String userFacingName,
+ LiquidNodeParams params, LiquidNodeParams flowParams,
+ String textures, int light) throws MossWorldLoadException {
+ LiquidNode nd = new LiquidNode(params, textures, sysname,
+ userFacingName, light);
+ this.nm.putNode(nd);
+ nd.level = 0;
+ for (int i = 1; i < 8; i++) {
+ LiquidNode innerNd = new LiquidNode(flowParams, textures, sysname
+ + "$LEVEL$" + i, userFacingName, light); //$NON-NLS-1$
+ innerNd.setByBounds(-.5f, .5f, -.5f, .5f, -.5f, (i / 8f) - 0.5f);
+ nd.liquidLevels[i] = innerNd;
+ innerNd.liquidLevels = nd.liquidLevels;
+ innerNd.level = i;
+ this.nm.putNode(innerNd);
+ }
+ nd.liquidLevels[0] = nd;
+ return nd;
+ }
+
+ /**
+ * Registers a node alias. Since the map generator and scripts work via
+ * string names, registering an alias of mg:dirt to myscript:specialdirt
+ * will cause a mapgen that recognizes mg:dirt as a generated element to use
+ * specialdirt for that.
+ *
+ * @param alias The alias to create, i.e. mg:dirt
+ * @param dst The existing node to set as the alias target, i.e
+ * myscript:specialdirt. This element must already exist.
+ */
+ public void registerNodeAlias(String alias, String dst) {
+ this.nm.putNodeAlias(alias, dst);
+ }
+
+
+ /**
+ * Gets the inv by name.
+ *
+ * @param player the player
+ * @param name the name
+ * @return the inv by name
+ */
+ public MossInventory getInvByName(Player player, String name) {
+ return null;
+ }
+
+ /**
+ * Creates the inv by name.
+ *
+ * @param p the p
+ * @param name the name
+ * @return the moss inventory
+ */
+ public MossInventory createInvByName(Player p, String name) {
+ return null;
+ }
+
+ /**
+ * Gets the player by name.
+ *
+ * @param name the name
+ * @return the player by name
+ */
+ public Player getPlayerByName(String name) {
+ return null;
+ }
+
+ /**
+ * Gets the node by name.
+ *
+ * @param name the name
+ * @return the node by name
+ */
+ public MapNode getNodeByName(String name) {
+ return null;
+ }
+
+ /**
+ * Gets the db.
+ *
+ * @return the db
+ */
+ public ScriptableDatabase getDb() {
+ return this.db;
+ }
+
+ /**
+ * Instantiates a new moss script env.
+ *
+ * @param db the db
+ * @param nc the nc
+ * @param fp the fp
+ * @param nm the nm
+ */
+ public MossScriptEnv(ScriptableDatabase db, MapCache nc,
+ FuturesProcessor fp, INodeManager nm) {
+ this.db = db;
+ this.nc = nc;
+ this.fp = fp;
+ this.nm = nm;
+ }
+
+ /**
+ * Gets the futures processor.
+ *
+ * @return the futures processor
+ */
+ public FuturesProcessor getFuturesProcessor() {
+ return this.fp;
+ }
+
+ private HashMap, List> handlers = new HashMap<>();
+
+ public List getEventHandlers(
+ Class extends IMossEvent> clazz) {
+ List l = Collections.unmodifiableList(handlers.get(clazz));
+ if (l == null) {
+ handlers.put(clazz, new ArrayList());
+ return Collections.EMPTY_LIST;
+ }
+ return l;
+
+ }
+
+ public void registerHandler(MossEventHandler handler, Class extends IMossEvent> clazz) {
+ List l = handlers.get(clazz);
+ if (l == null) {
+ l = new ArrayList();
+ handlers.put(clazz, l);
+ }
+ l.add(new WrappedHandler(handler, this.requestedScriptApiVer.get()));
+
+ }
+
+}
+>>>>>>> netclient
diff --git a/src/net/mosstest/scripting/Player.java b/src/net/mosstest/scripting/Player.java
index 79595ea..3cda4fd 100644
--- a/src/net/mosstest/scripting/Player.java
+++ b/src/net/mosstest/scripting/Player.java
@@ -26,6 +26,8 @@ public class Player {
*/
private HashMap inventories = new HashMap<>();
+ public int playerId;
+
/**
* The name.
*/
diff --git a/src/net/mosstest/scripting/WrappedHandler.java b/src/net/mosstest/scripting/WrappedHandler.java
new file mode 100644
index 0000000..680cb35
--- /dev/null
+++ b/src/net/mosstest/scripting/WrappedHandler.java
@@ -0,0 +1,23 @@
+package net.mosstest.scripting;
+
+import net.mosstest.scripting.handlers.MossEventHandler;
+
+/**
+ * Created by hexafraction on 5/3/14.
+ */
+public class WrappedHandler {
+ private final MossEventHandler handler;
+ private final short requestedApiVer;
+ public WrappedHandler(MossEventHandler handler, short requestedApiVer) {
+ this.handler = handler;
+ this.requestedApiVer = requestedApiVer;
+ }
+
+ public MossEventHandler getHandler() {
+ return handler;
+ }
+
+ public short getRequestedApiVer() {
+ return requestedApiVer;
+ }
+}
diff --git a/src/net/mosstest/scripting/gametext/game.properties~ b/src/net/mosstest/scripting/gametext/game.properties~
new file mode 100644
index 0000000..04ab351
--- /dev/null
+++ b/src/net/mosstest/scripting/gametext/game.properties~
@@ -0,0 +1,2 @@
+#This properties file describes game tidbits such as item names, materials, and other things a player might interact with. These are for modders' convenience.
+
diff --git a/src/net/mosstest/scripting/messages_it.properties b/src/net/mosstest/scripting/messages_it.properties
new file mode 100644
index 0000000..c0b1f52
--- /dev/null
+++ b/src/net/mosstest/scripting/messages_it.properties
@@ -0,0 +1,4 @@
+AntiCheatController.THREAD_NAME=antitruffa
+MossEvent.MSG_CROSS_DMZ_SECURITY_WARNING=Tentativo di accedere alle risorse controllate nello script DMZ.
+ScriptableDatabase.DB_NAME_INVALID=Nome della banca dati non valido.
+INV_IOEXCEPTION_FATAL=IOException durante la serializzazione di un inventario. IL MONDO CADRA' A BREVE.
diff --git a/src/net/mosstest/servercore/AbstractMossScript.java b/src/net/mosstest/servercore/AbstractMossScript.java
index e4026b4..8f05e1d 100644
--- a/src/net/mosstest/servercore/AbstractMossScript.java
+++ b/src/net/mosstest/servercore/AbstractMossScript.java
@@ -1,3 +1,4 @@
+<<<<<<< HEAD
package net.mosstest.servercore;
import java.io.IOException;
@@ -34,3 +35,41 @@ public abstract class AbstractMossScript {
return name.hashCode();
}
}
+=======
+package net.mosstest.servercore;
+
+import java.io.IOException;
+import java.util.List;
+
+public abstract class AbstractMossScript {
+
+ protected AbstractMossScript(String name) {
+ this.name = name;
+ }
+
+ @org.jetbrains.annotations.NonNls
+ protected final String name;
+ public abstract void exec(ScriptEnv sEnv) throws IOException, MossWorldLoadException;
+
+ public abstract IMossFile getInitFile() throws IOException;
+
+ public abstract List getDependencies();
+
+ @Override
+ public final boolean equals(Object o) {
+ if (this == o) return true;
+ if (!(o instanceof AbstractMossScript)) return false;
+
+ AbstractMossScript that = (AbstractMossScript) o;
+
+ if (!name.equals(that.name)) return false;
+
+ return true;
+ }
+
+ @Override
+ public final int hashCode() {
+ return name.hashCode();
+ }
+}
+>>>>>>> netclient
diff --git a/src/net/mosstest/servercore/ApplicationLevelNetworkingManager.java b/src/net/mosstest/servercore/ApplicationLevelNetworkingManager.java
index a7a2a64..4df0b48 100644
--- a/src/net/mosstest/servercore/ApplicationLevelNetworkingManager.java
+++ b/src/net/mosstest/servercore/ApplicationLevelNetworkingManager.java
@@ -1,5 +1,6 @@
package net.mosstest.servercore;
+import net.mosstest.client.ClientNetworkingManager;
import net.mosstest.scripting.Position;
// TODO: Auto-generated Javadoc
diff --git a/src/net/mosstest/servercore/ClientManager.java b/src/net/mosstest/servercore/ClientManager.java
index 9159162..8b24ddb 100644
--- a/src/net/mosstest/servercore/ClientManager.java
+++ b/src/net/mosstest/servercore/ClientManager.java
@@ -1,5 +1,7 @@
package net.mosstest.servercore;
+import net.mosstest.client.ClientNetworkingManager;
+
import java.io.IOException;
diff --git a/src/net/mosstest/servercore/CommonNetworking.java b/src/net/mosstest/servercore/CommonNetworking.java
index 00604fc..7277e86 100644
--- a/src/net/mosstest/servercore/CommonNetworking.java
+++ b/src/net/mosstest/servercore/CommonNetworking.java
@@ -7,11 +7,11 @@ package net.mosstest.servercore;
public class CommonNetworking {
/** The Constant magic. */
- static final int magic=0xfa7d2e4a;
+ public static final int magic=0xfa7d2e4a;
/** The Constant magicNoAck. */
- static final int magicNoAck=0xfa7d2e4f;
+ public static final int magicNoAck=0xfa7d2e4f;
/** The Constant magicAck. */
- static final int magicAck=0xfa7d2740;
+ public static final int magicAck=0xfa7d2740;
}
diff --git a/src/net/mosstest/servercore/EventProcessor.java b/src/net/mosstest/servercore/EventProcessor.java
index 28da6ee..846e777 100644
--- a/src/net/mosstest/servercore/EventProcessor.java
+++ b/src/net/mosstest/servercore/EventProcessor.java
@@ -1,9 +1,6 @@
package net.mosstest.servercore;
-import net.mosstest.scripting.MapNode;
-import net.mosstest.scripting.MossScriptEnv;
-import net.mosstest.scripting.MossScriptException;
-import net.mosstest.scripting.NodePosition;
+import net.mosstest.scripting.*;
import net.mosstest.scripting.events.IMossEvent;
import net.mosstest.scripting.events.MossNodeChangeEvent;
import net.mosstest.scripting.events.ThreadStopEvent;
@@ -27,9 +24,9 @@ import java.util.concurrent.atomic.AtomicInteger;
* The Class EventProcessor.
*
* @author rarkenin, hexafraction
- *
+ *
* Blargh.
- *
+ *
* This is a nasty thread pool. If you don't understand threading or
* Java well, you may want to stick to only accessing the queue as
* otherwise asphyxiation, drowning, or chlorine poisoning may occur.
@@ -101,10 +98,10 @@ public class EventProcessor {
}
private void dispatchEvent(IMossEvent evt) {
- List evtHandlerList = this.ev
+ List evtHandlerList = this.ev
.getEventHandlers(evt.getClass());
try {
- for (MossEventHandler ourHandler : evtHandlerList) {
+ for (WrappedHandler ourHandler : evtHandlerList) {
if (dispatchEventInner(ourHandler, evt)) {
return;
}
@@ -116,13 +113,16 @@ public class EventProcessor {
}
}
- private boolean dispatchEventInner(MossEventHandler ourHandler,
+ private boolean dispatchEventInner(WrappedHandler wrappedHandler,
IMossEvent evt) throws IllegalArgumentException {
+ MossEventHandler ourHandler = wrappedHandler.getHandler();
try {
if (evt instanceof MossNodeChangeEvent) {
-
- return ((MossNodeChangeHandler) ourHandler)
- .onAction((MossNodeChangeEvent) evt);
+ {
+ this.ev.setRequestedScriptApiVer(wrappedHandler.getRequestedApiVer());
+ return ((MossNodeChangeHandler) ourHandler)
+ .onAction((MossNodeChangeEvent) evt);
+ }
} else
throw new IllegalArgumentException(
@@ -174,7 +174,8 @@ public class EventProcessor {
processEvents();
}
- });
+ }
+ );
threads[c].start();
EventProcessor.this.currentThreads.incrementAndGet();
@@ -199,7 +200,8 @@ public class EventProcessor {
processEvents();
}
- }).run();
+ }
+ ).run();
EventProcessor.this.currentThreads
.incrementAndGet();
@@ -221,11 +223,11 @@ public class EventProcessor {
}
}
}
- }, Messages.getString("EventProcessor.THREAD_NAME_MGR"));
+ }, Messages.getString("EventProcessor.THREAD_NAME_MGR")
+ );
manager.start();
}
-
}
diff --git a/src/net/mosstest/servercore/IFileManager.java b/src/net/mosstest/servercore/IFileManager.java
index eee3802..cf2a6f5 100644
--- a/src/net/mosstest/servercore/IFileManager.java
+++ b/src/net/mosstest/servercore/IFileManager.java
@@ -2,16 +2,61 @@ package net.mosstest.servercore;
import com.jme3.asset.AssetLocator;
+import java.io.File;
+import java.io.FileInputStream;
+import java.io.FileNotFoundException;
import java.io.IOException;
import java.nio.ByteBuffer;
+import java.nio.channels.FileChannel;
+import java.security.MessageDigest;
+import java.security.NoSuchAlgorithmException;
import java.util.List;
public interface IFileManager {
+ static String getHash(File f) throws IOException,
+ NoSuchAlgorithmException, FileNotFoundException {
+
+
+ MessageDigest md = MessageDigest.getInstance("SHA-256");
+
+ try (FileInputStream fis = new FileInputStream(f)) {
+ try (FileChannel fc = fis.getChannel()) {
+ ByteBuffer bbf = ByteBuffer.allocateDirect(LocalFileManager.HASHING_BUFFER_SIZE);
+
+ int bytesRead;
+
+ bytesRead = fc.read(bbf);
+
+ while ((bytesRead != -1) && (bytesRead != 0)) {
+ bbf.flip();
+
+
+ md.update(bbf);
+
+ bbf.clear();
+ bytesRead = fc.read(bbf);
+ }
+
+ fis.close();
+
+ byte[] mdBytes = md.digest();
+
+ StringBuilder hexString = new StringBuilder();
+
+ for (byte b : mdBytes) {
+ hexString.append(Integer.toHexString((LocalFileManager.BYTE_CAST_MASK & b)));
+ }
+
+ return hexString.toString();
+ }
+ }
+ }
+
public IMossFile getFile(String name) throws IOException;
- public void registerFile(String name, String sha256, long size);
+ public void registerFile(String name, String sha256, long size) throws IOException;
- public void receiveFileChunk(String sha512, int chunkId, ByteBuffer buf) throws IOException;
+ public void receiveFileChunk(String sha256, int chunkId, ByteBuffer buf) throws IOException;
public Class extends AssetLocator> getAssetLocatorClass();
diff --git a/src/net/mosstest/servercore/IMossFile.java b/src/net/mosstest/servercore/IMossFile.java
index 268b3ad..d8b5b8d 100644
--- a/src/net/mosstest/servercore/IMossFile.java
+++ b/src/net/mosstest/servercore/IMossFile.java
@@ -19,4 +19,8 @@ public interface IMossFile {
public String getSha256();
public String getName();
+
+ public boolean isComplete();
+
+ public long getSize();
}
\ No newline at end of file
diff --git a/src/net/mosstest/servercore/LocalFile.java b/src/net/mosstest/servercore/LocalFile.java
index 0b83803..6ef5455 100644
--- a/src/net/mosstest/servercore/LocalFile.java
+++ b/src/net/mosstest/servercore/LocalFile.java
@@ -34,6 +34,17 @@ public class LocalFile implements IMossFile {
return name;
}
+ @Override
+ public boolean isComplete() {
+ // local files are always complete
+ return true;
+ }
+
+ @Override
+ public long getSize() {
+ return f.length();
+ }
+
private final String sha256;
public LocalFile(String name, File f) throws IOException, FileNotFoundException {
@@ -47,7 +58,7 @@ public class LocalFile implements IMossFile {
this.numChunks = (int) Math.ceil(this.length
/ ((double) IMossFile.CHUNK_SIZE));
try {
- this.sha256 = LocalFileManager.getHash(f);
+ this.sha256 = IFileManager.getHash(f);
logger.info(MessageFormat.format(Messages.getString("HASH_SUCCESS"), f.getAbsolutePath(), this.sha256));
} catch (NoSuchAlgorithmException e) {
logger.error(MessageFormat.format(Messages.getString("ALGO_NOT_FOUND"), f.getAbsolutePath()));
diff --git a/src/net/mosstest/servercore/LocalFileManager.java b/src/net/mosstest/servercore/LocalFileManager.java
index 0b7cf18..6071476 100644
--- a/src/net/mosstest/servercore/LocalFileManager.java
+++ b/src/net/mosstest/servercore/LocalFileManager.java
@@ -93,45 +93,6 @@ public class LocalFileManager implements IFileManager {
}
- public static String getHash(File f) throws IOException,
- NoSuchAlgorithmException, FileNotFoundException {
-
-
- MessageDigest md = MessageDigest.getInstance("SHA-256"); //NON-NLS
-
- try (FileInputStream fis = new FileInputStream(f)) {
- try (FileChannel fc = fis.getChannel()) {
- ByteBuffer bbf = ByteBuffer.allocateDirect(HASHING_BUFFER_SIZE);
-
- int bytesRead;
-
- bytesRead = fc.read(bbf);
-
- while ((bytesRead != -1) && (bytesRead != 0)) {
- bbf.flip();
-
-
- md.update(bbf);
-
- bbf.clear();
- bytesRead = fc.read(bbf);
- }
-
- fis.close();
-
- byte[] mdBytes = md.digest();
-
- StringBuilder hexString = new StringBuilder();
-
- for (byte b : mdBytes) {
- hexString.append(Integer.toHexString((BYTE_CAST_MASK & b)));
- }
-
- return hexString.toString();
- }
- }
- }
-
@Override
public List extends IMossFile> getFiles() {
return ImmutableList.copyOf(files.values());
diff --git a/src/net/mosstest/servercore/MossNetPacket.java b/src/net/mosstest/servercore/MossNetPacket.java
index 750b61e..c901698 100644
--- a/src/net/mosstest/servercore/MossNetPacket.java
+++ b/src/net/mosstest/servercore/MossNetPacket.java
@@ -4,40 +4,19 @@ package net.mosstest.servercore;
import java.util.Arrays;
-/**
- * The Class MossNetPacket.
- */
public class MossNetPacket {
- /**
- * The command id.
- */
- int commandId;
+ public int commandId;
- /**
- * The payload.
- */
- byte[] payload;
+ public byte[] payload;
- /**
- * The needs fast.
- */
- boolean needsFast;
+ public boolean needsFast;
- /**
- * The needs ack.
- */
- boolean needsAck;
+ public boolean needsAck;
- /**
- * The is important.
- */
- boolean isImportant;
+ public boolean isImportant;
- /**
- * The sess.
- */
- ServerSession sess;
+ public ServerSession sess;
/**
* Constructs a packet, for either sending or from receiving.
diff --git a/src/net/mosstest/servercore/MossWorld.java b/src/net/mosstest/servercore/MossWorld.java
index 94d066c..4480466 100644
--- a/src/net/mosstest/servercore/MossWorld.java
+++ b/src/net/mosstest/servercore/MossWorld.java
@@ -14,10 +14,13 @@ import org.jetbrains.annotations.NonNls;
import java.io.File;
import java.io.IOException;
import java.util.List;
+import java.util.Locale;
public class MossWorld {
static {
System.setSecurityManager(MosstestSecurityManager.instance);
+ Messages.changeLanguage(Locale.ITALIAN);
+ net.mosstest.scripting.Messages.changeLanguage(Locale.ITALIAN);
}
static Logger logger = Logger.getLogger(MossWorld.class);
diff --git a/src/net/mosstest/servercore/messages_it.properties b/src/net/mosstest/servercore/messages_it.properties
new file mode 100644
index 0000000..45b7990
--- /dev/null
+++ b/src/net/mosstest/servercore/messages_it.properties
@@ -0,0 +1,53 @@
+AbstractNodeManager.DESC_UNKNOWN_NODE=Un pezzo sconosciuto del mondo
+ClientNetworkingManager.DESC_NETWORK_TIMEOUT=La connessione al server \u00E8 stata persa o \u00E8 diventata troppo lenta per continuare. \nProbabilmente questo \u00E8 dovuto a una connessione instabile, WiFi debole, cavi allentati, o un problema di firewall.
+ClientNetworkingManager.THREAD_NET_TIMEOUT=netTimeout
+ClientNetworkingManager.THREAD_QUEUEING=netClientSendQueue
+DefaultEventHandlers.NO_SUCH_CMD=Comando di chat inesistente.
+EventProcessor.MSG_ADD_DYNAMIC=Thread aggiunto dinamicamente
+EventProcessor.MSG_STOP_ONE_THREAD=Arresto di un thread...
+EventProcessor.MSG_THREAD_START=E' iniziato un thread di lavoro.
+EventProcessor.THREAD_NAME_MGR=EventProcessorManager
+EventProcessor.THREADGROUP=EventProcessor
+FuturesProcessor.FUTURES_THREAD=futuri
+LocalRenderPreparator.MG_EXCEPT=Il generatore di mappe ha emesso una eccezione.
+LocalRenderPreparator.MSG_REQUESTED=Aree richieste {0}, {1}, {2}.
+LocalRenderPreparator.START_MSG=Il preparatore di rendering locale si sta avviando.
+MapChunk.BAD_SER_VER=Versione di serializzazione sbagliata
+MapDatabase.ERR_DB_FAIL=Caricamento della banca dati fallito.
+MossDebugUtils.27=git.build.time
+MossDebugUtils.MSG_BUILT_ON=Costruito su\:
+MossDebugUtils.MSG_CORES=Processori disponibili\:
+MossDebugUtils.MSG_EXCEPTION_CAUGHT=<<>> \n
+MossDebugUtils.MSG_FREE_SPACE=Spazio libero (byte)\:
+MossDebugUtils.MSG_FREEMEM=Memoria libera (byte)\:
+MossDebugUtils.MSG_FS_ROOT=File sistem radice\:
+MossDebugUtils.MSG_IO_EXCEPTION=IOException in caricamento, forse inesistente?
+MossDebugUtils.MSG_JAVA_PROPS=<<>>\n
+MossDebugUtils.MSG_MAXMEM=Memoria massima (byte)\:
+MossDebugUtils.MSG_MEM_NO_LIMIT=nessun limite
+MossDebugUtils.MSG_SYS_PROPS=<<>>\n
+MossDebugUtils.MSG_TOTAL_MEM=Memoria totale (byte)\:
+MossDebugUtils.MSG_TOTAL_SPACE=Spazio totale (byte)\:
+MossDebugUtils.MSG_USABLE_SPACE=Spazio utilizzabile (byte)\:
+MossGame.CFG_LOAD_ERR=Errore nel caricamento del file di configurazione.
+MossGame.DIR_OR_CFG_NOT_FOUND=Cartella del gioco o file di configurazione non trovati.
+MossGame.FILE_NOT_FOUND=Il file {0} non \u00E8 stato trovato.
+MossScript.[NAME]_NOT_FOUND=\ non trovato\!
+MossScript.MSG_IO_EXCEPTION=IOException con lo script chiamato
+MossScript.MSG_OOPS=Abbiamo per le mani una situazione estremamente inaspettata
+MossScript.MSG_SCRIPT_NAMED_[NAME]=Script chiamato
+MossTest.PORT_DESC=Numero della porta da usare
+MossTest.RUN_STANDALONE=Eseguire come server autonomo
+MossWorld.ERR_DB=E' avvenuto un errore nell'apertura della banca dati. Probabilmente non \u00E8 accessibile, su un disco pieno, o corrotta.
+MossWorld.MG_SELECT_FAILURE=Non \u00E8 stato possibile inserire il seme nel generatore di mappe.
+MossWorld.NO_GAME_ID=Non \u00E8 specificato lo ID del gioco. Lo ID del gioco deve essere specificato in game.xml come pincopallino dove data/games/pincopallino \u00E8 una cartella con un gioco valido.
+MossWorld.NO_NETWORKING_NOW=La connettivit\u00E0 non \u00E8 completa in questa versione.
+NodeManager.DESC_UNKNWN_NODE=Un pezzo sconosciuto del mondo
+ScriptEnv.ERR_SCRIPT_ERR=E'' avvenuto un errore di script. Eccezione impacchettata\: {0} \n
+ServerNetworkingManager.ACCEPT_THREAD=svrNetAccept
+ServerNetworkingManager.CONN_THREAD_NAME=thread di connessione
+ServerNetworkingManager.THREADGROUP=SvrNetGroup
+PACKET_INVALID_MAGIC=E'' stato ricevuto un pacchetto con un numero magico non valido ed \u00E8 stato gettato.
+SERVER_CONN_TIMEOUT=La connessione al server \u00E8 scaduta o fallita in un altro modo.
+FIXME_MESSAGE=Toccato un blocco di codice che rappresenta una funzionalit\u00E0 mancante. Per favore compilate un rapporto di bug oppure ricordatelo bruscamente agli sviluppatori in un altro modo.
+EVENT_PROCESS_EXCEPTION=Notato {0} nell''elaborazione di un evento di tipo {1}. Il messaggio dell''eccezione era {2}.