Welcome!

Join our community of MMO enthusiasts and game developers! By registering, you'll gain access to discussions on the latest developments in MMO server files and collaborate with like-minded individuals. Join us today and unlock the potential of MMO server development!

Join Today!

GameDB guide

Newbie Spellweaver
Joined
May 25, 2007
Messages
30
Reaction score
11
Hello,

I'm back to PW Development (been busy a lot since I was busy with lots of Universities tasks given, damn)

Here are the constructors, methods, behaviors, operational commands for classname GameDB and Faction related. Other than that, view bottom for more classes. All credits to me

Class Name : RoleBean (For Character/Role Information)
PHP:
package protocol;

import com.goldhuman.Common.Octets;
import com.goldhuman.IO.Protocol.Rpc.Data.DataVector;

public class RoleBean
{
  public static final int MAGIC_CLASS = 5;
  public User user;
  public GRoleBase base;
  public GRoleStatus status;
  public GRolePocket pocket;
  public Rpc.Data.DataVector equipment;
  public GRoleStorehouse storehouse;
  public GRoleTask task;
  public extend_prop ep = new extend_prop();

  public RoleBean() {
    this.user = new User();
    this.base = new GRoleBase();
    this.status = new GRoleStatus();
    this.pocket = new GRolePocket();
    this.equipment = new Rpc.Data.DataVector(new GRoleInventory());
    this.storehouse = new GRoleStorehouse();
    this.task = new GRoleTask();
  }

  public String getLogString()
  {
    String n = "";
    try { n = this.base.name.getString(); } catch (Exception e) { e.printStackTrace(); }
    return new String("roleid=" + this.base.id + ",name=" + n + ",level=" + this.status.level + ",level2=" + this.status.level2 + ",exp=" + this.status.exp + ",sp=" + this.status.sp + ",pp=" + this.status.pp + ",money=" + this.pocket.money);
  }

  public boolean SetGRoleStatus(GRoleStatus status)
  {
    if (null == status) {
      return false;
    }
    this.status = status;
    this.ep = new extend_prop();

    return this.ep.set(status.property.getBytes());
  }

  public GRoleStatus GetGRoleStatus()
  {
    this.status.property.replace(this.ep.getBytes());
    return this.status;
  }

  public static String ClsName(int cls)
  {
    switch (cls) {
    case 0:
      return "武侠";
    case 1:
      return "法师";
    case 2:
      return "僧侣";
    case 3:
      return "妖精";
    case 4:
      return "妖兽";
    case 5:
      return "魅灵";
    case 6:
      return "羽芒";
    case 7:
      return "羽灵";
    }return "未知";
  }

  public static String GenderName(byte gender)
  {
    return gender > 0 ? "女" : "男";
  }

  public static String StatusName(int status)
  {
    if (1 == status)
      return "正常";
    if (2 == status)
      return "必须删除";
    if (3 == status) {
      return "准备删除";
    }
    return "未知";
  }

  public class extend_prop
  {
    public static final int MAGIC_CLASS = 5;
    public int vitality;
    public int energy;
    public int strength;
    public int agility;
    public int max_hp;
    public int max_mp;
    public int hp_gen;
    public int mp_gen;
    public float walk_speed;
    public float run_speed;
    public float swim_speed;
    public float flight_speed;
    public int attack;
    public int damage_low;
    public int damage_high;
    public int attack_speed;
    public float attack_range;
    public int[] addon_damage_low;
    public int[] addon_damage_high;
    public int damage_magic_low;
    public int damage_magic_high;
    public int[] resistance;
    public int defense;
    public int armor;
    public int max_ap;

    public extend_prop()
    {
      this.addon_damage_low = new int[5];
      this.addon_damage_high = new int[5];
      this.resistance = new int[5];
    }

    private int getInt(byte b1, byte b2, byte b3, byte b4)
    {
      int izero = 0;
      return 0xFF000000 & b4 << 24 | 0xFF0000 & b3 << 16 | 0xFF00 & b2 << 8 | 0xFF & b1;
    }

    private byte[] getBytes(int i)
    {
      byte[] bts = new byte[4];
      bts[0] = (byte)(0xFF & i);
      bts[1] = (byte)(0xFF & i >> 8);
      bts[2] = (byte)(0xFF & i >> 16);
      bts[3] = (byte)(0xFF & i >> 24);
      return bts;
    }

    private byte[] getByteArray(int[] ia) {
      int n = ia.length;
      byte[] bts = new byte[n * 4];
      for (int i = 0; i < n; i++)
      {
        byte[] tbts = getBytes(ia[i]);
        bts[(i * 4)] = tbts[0];
        bts[(i * 4 + 1)] = tbts[1];
        bts[(i * 4 + 2)] = tbts[2];
        bts[(i * 4 + 3)] = tbts[3];
      }
      return bts;
    }

    private int[] getIntArray(byte[] p) {
      int n = p.length / 4;
      int[] ip = new int[n];
      for (int i = 0; i < n; i++)
      {
        ip[i] = getInt(p[(i * 4)], p[(i * 4 + 1)], p[(i * 4 + 2)], p[(i * 4 + 3)]);
      }
      return ip;
    }

    public boolean set(byte[] p) {
      if ((null == p) || (p.length < 144) || (p.length > 148))
        return false;
      int[] ip = getIntArray(p);
      this.vitality = ip[0];
      this.energy = ip[1];
      this.strength = ip[2];
      this.agility = ip[3];
      this.max_hp = ip[4];
      this.max_mp = ip[5];
      this.attack = ip[12];
      this.damage_low = ip[13];
      this.damage_high = ip[14];
      for (int i = 0; i < 5; i++)
      {
        this.addon_damage_low[i] = ip[(17 + i * 2)];
        this.addon_damage_high[i] = ip[(18 + i * 2)];
      }
      this.damage_magic_low = ip[27];
      this.damage_magic_high = ip[28];
      for (int i = 0; i < 5; i++)
      {
        this.resistance[i] = ip[(29 + i)];
      }
      this.defense = ip[34];
      this.armor = ip[35];
      if (p.length >= 148)
        this.max_ap = ip[36];
      return true;
    }

    public byte[] getBytes() {
      int[] ip = new int[37];
      ip[0] = this.vitality;
      ip[1] = this.energy;
      ip[2] = this.strength;
      ip[3] = this.agility;
      ip[4] = this.max_hp;
      ip[5] = this.max_mp;
      ip[12] = this.attack;
      ip[13] = this.damage_low;
      ip[14] = this.damage_high;

      for (int i = 0; i < 5; i++)
      {
        ip[(17 + i * 2)] = this.addon_damage_low[i];
        ip[(18 + i * 2)] = this.addon_damage_high[i];
      }
      ip[27] = this.damage_magic_low;
      ip[28] = this.damage_magic_high;
      for (int i = 0; i < 5; i++)
      {
        ip[(29 + i)] = this.resistance[i];
      }
      ip[34] = this.defense;
      ip[35] = this.armor;
      ip[36] = this.max_ap;
      return getByteArray(ip);
    }
  }
}
/* Location:           D:\PW\MarHazK\
 * Qualified Name:     com.goldhuman.service.interfaces.RoleBean
 */

Classname: GameDB
PHP:
package protocol;

import com.goldhuman.Common.Octets;
import com.goldhuman.IO.PollIO;
import com.goldhuman.IO.Protocol.Protocol;
import com.goldhuman.IO.Protocol.Rpc;
import com.goldhuman.IO.Protocol.Rpc.Data.DataVector;

public class GameDB
{
  public static final Object locker = new Object();
  public static ClientManager mgr = new ClientManager();

  public static void init()
    throws InterruptedException
  {
    synchronized (mgr)
    {
      if (null == mgr.s)
      {
        Protocol.Client(mgr);
        mgr.wait();
      }
    }
  }

  public static Rpc.Data.DataVector getRolelist(int userid) throws Exception {
    init();
    if (null == mgr.s)
      return null;
    synchronized (locker)
    {
      GetUserRolesArg arg = new GetUserRolesArg();
      arg.userid = userid;

      GetUserRoles rpc = (GetUserRoles)Rpc.Call("GetUserRoles", arg);
      if (!mgr.Send(mgr.s, rpc)) throw new Exception("网络连接未建立。(getRolelist)");
      PollIO.WakeUp();
      locker.wait();
      if (4 == rpc.retcode) throw new Exception("网络通讯超时。(getRoleList)");
      if ((0 != rpc.retcode) || (rpc.userid == -1))
        return null;
      return rpc.roles;
    }
  }

  public static int getRoleIdByName(String rolename) throws Exception {
    init();
    if (null == mgr.s)
      return -1;
    synchronized (locker)
    {
      GetRoleIdArg arg = new GetRoleIdArg();
      arg.rolename.setString(rolename);

      GetRoleId rpc = (GetRoleId)Rpc.Call("GetRoleId", arg);
      if (!mgr.Send(mgr.s, rpc)) throw new Exception("网络连接未建立。(getRoleIdByName)");
      PollIO.WakeUp();
      locker.wait();
      if (4 == rpc.retcode) throw new Exception("网络通讯超时。(getRoleIdByName)");
      return rpc.roleid;
    }
  }

  public static int canChangeRolename(String rolename, int setcanchange) throws Exception {
    init();
    if (null == mgr.s)
      return -1;
    synchronized (locker)
    {
      CanChangeRolenameArg arg = new CanChangeRolenameArg();
      arg.rolename.setString(rolename);
      arg.setcanchange = setcanchange;

      CanChangeRolename rpc = (CanChangeRolename)Rpc.Call("CanChangeRolename", arg);
      if (!mgr.Send(mgr.s, rpc)) throw new Exception("网络连接未建立。(canChangeRolename)");
      PollIO.WakeUp();
      locker.wait();
      if (4 == rpc.retcode) throw new Exception("网络通讯超时。(canChangeRolename)");
      return rpc.retcode;
    }
  }

  public static int clearStorehousePasswd(int roleid, String rolename) throws Exception {
    init();
    if (null == mgr.s) {
      return -1;
    }
    synchronized (locker)
    {
      ClearStorehousePasswdArg arg = new ClearStorehousePasswdArg();
      arg.roleid = roleid;
      arg.rolename.setString(rolename);

      ClearStorehousePasswd rpc = (ClearStorehousePasswd)Rpc.Call("ClearStorehousePasswd", arg);
      if (!mgr.Send(mgr.s, rpc)) return -1;
      PollIO.WakeUp();
      locker.wait();
      return rpc.retcode;
    }
  }

  public static int renameRole(int roleid, String oldname, String newname) throws Exception {
    init();
    if (null == mgr.s) {
      return -1;
    }
    synchronized (locker)
    {
      RenameRoleArg arg = new RenameRoleArg();
      arg.roleid = roleid;
      arg.oldname.setString(oldname);
      arg.newname.setString(newname);

      RenameRole rpc = (RenameRole)Rpc.Call("RenameRole", arg);
      if (!mgr.Send(mgr.s, rpc)) return -1;
      PollIO.WakeUp();
      locker.wait();
      return rpc.retcode;
    }
  }

  public static int DBVerifyMaster(String rolename, String factionname) throws Exception {
    init();
    if (null == mgr.s)
      return -1;
    synchronized (locker)
    {
      DBVerifyMasterArg arg = new DBVerifyMasterArg();
      arg.name.setString(rolename);
      arg.faction.setString(factionname);

      DBVerifyMaster rpc = (DBVerifyMaster)Rpc.Call("DBVerifyMaster", arg);
      if (!mgr.Send(mgr.s, rpc)) return -1;
      PollIO.WakeUp();
      locker.wait();
      return rpc.retcode;
    }
  }

  public static boolean deleteRolePermanent(int roleid) throws InterruptedException, Exception
  {
    init();
    if (null == mgr.s) {
      return false;
    }
    synchronized (locker)
    {
      DBDeleteRoleArg arg = new DBDeleteRoleArg();
      arg.roleid = roleid;

      DBDeleteRole rpc = (DBDeleteRole)Rpc.Call("DBDeleteRole", arg);
      if (!mgr.Send(mgr.s, rpc)) throw new Exception("网络连接未建立。(deleteRolePermanent)");
      PollIO.WakeUp();
      locker.wait();
      if (4 == rpc.retcode) throw new Exception("网络通讯超时。(deleteRolePermanent)");
      return 0 == rpc.retcode;
    }
  }

  public static int createRole(int userid, XmlRole.Role role)
    throws InterruptedException, Exception
  {
    init();
    if (null == mgr.s) {
      return -1;
    }
    synchronized (locker)
    {
      DBCreateRoleArg arg = new DBCreateRoleArg();
      arg.roleid = userid;
      arg.roleinfo.roleid = role.base.id;
      arg.roleinfo.gender = role.base.gender;
      arg.roleinfo.race = (byte)role.base.race;
      arg.roleinfo.occupation = (byte)role.base.cls;
      arg.roleinfo.level = role.status.level;
      arg.roleinfo.name = role.base.name;

      DBCreateRole rpc = (DBCreateRole)Rpc.Call("DBCreateRole", arg);
      if (!mgr.Send(mgr.s, rpc)) throw new Exception("网络连接未建立。(createRole)");
      PollIO.WakeUp();
      locker.wait();
      if (4 == rpc.retcode) throw new Exception("网络通讯超时。(createRole)");
      if (0 == rpc.retcode)
      {
        role.base.id = rpc.roleid;
        return rpc.roleid;
      }
      return rpc.retcode > 0 ? -rpc.retcode : rpc.retcode;
    }
  }

  public static boolean moveRole(int roleid, int newuserid)
    throws InterruptedException, Exception
  {
    XmlRole.Role role = XmlRole.getRoleFromDB(roleid);

    if (null == role)
    {
      throw new Exception("GameDB moveRole. get roleid failed. roleid=" + roleid);
    }
    if (createRole(newuserid, role) < 0)
    {
      throw new Exception("GameDB moveRole. create new role failed. newuserid=" + newuserid);
    }
    if (!XmlRole.putRoleToDB(role.base.id, role))
    {
      if (!deleteRolePermanent(role.base.id)) {
        throw new Exception("GameDB moveRole, put new role error and not left not delete. newroleid=" + role.base.id + "oldroleid=" + roleid);
      }
      throw new Exception("GameDB moveRole. put new role failed. newroleid=" + role.base.id);
    }
    if (!deleteRolePermanent(roleid))
    {
      if (!deleteRolePermanent(role.base.id)) {
        throw new Exception("GameDB moveRole, delete old role err and new role not delete. newroleid=" + role.base.id + "oldroleid=" + roleid);
      }
      throw new Exception("GameDB moveRole, delete old role failed. old roleid=" + roleid);
    }
    return true;
  }

  public static boolean putUser(int userid, User user)
    throws InterruptedException, Exception
  {
    init();
    if (null == mgr.s) {
      return false;
    }
    if (null == user) return false;

    synchronized (locker)
    {
      UserPair arg = new UserPair();
      arg.key.id = userid;
      arg.value = user;

      PutUser rpc = (PutUser)Rpc.Call("PutUser", arg);
      if (!mgr.Send(mgr.s, rpc)) throw new Exception("网络连接未建立。(putUser)");
      PollIO.WakeUp();
      locker.wait();
      if (4 == rpc.retcode) throw new Exception("网络通讯超时。(putUser)");
      return 0 == rpc.retcode;
    }
  }

  public static boolean putRoleBase(int roleid, GRoleBase base)
    throws InterruptedException, Exception
  {
    init();
    if (null == mgr.s) {
      return false;
    }
    if (null == base) return false;

    synchronized (locker)
    {
      RoleBasePair arg = new RoleBasePair();
      arg.key.id = roleid;
      arg.value = base;

      PutRoleBase rpc = (PutRoleBase)Rpc.Call("PutRoleBase", arg);
      if (!mgr.Send(mgr.s, rpc)) throw new Exception("网络连接未建立。(putRoleBase)");
      PollIO.WakeUp();
      locker.wait();
      if (4 == rpc.retcode) throw new Exception("网络通讯超时。(putRoleBase)");
      return 0 == rpc.retcode;
    }
  }

  public static boolean putRoleStatus(int roleid, GRoleStatus status)
    throws InterruptedException, Exception
  {
    init();
    if (null == mgr.s) {
      return false;
    }
    if (null == status) return false;

    synchronized (locker)
    {
      RoleStatusPair arg = new RoleStatusPair();
      arg.key.id = roleid;
      arg.value = status;

      PutRoleStatus rpc = (PutRoleStatus)Rpc.Call("PutRoleStatus", arg);
      if (!mgr.Send(mgr.s, rpc)) throw new Exception("网络连接未建立。(putRoleStatus)");
      PollIO.WakeUp();
      locker.wait();
      if (4 == rpc.retcode) throw new Exception("网络通讯超时。(putRoleStatus)");
      return 0 == rpc.retcode;
    }
  }

  public static boolean putRolePocket(int roleid, GRolePocket pocket)
    throws InterruptedException, Exception
  {
    init();
    if (null == mgr.s) {
      return false;
    }
    if (null == pocket) return false;

    synchronized (locker)
    {
      RolePocketPair arg = new RolePocketPair();
      arg.key.id = roleid;
      arg.value = pocket;

      PutRolePocket rpc = (PutRolePocket)Rpc.Call("PutRolePocket", arg);
      if (!mgr.Send(mgr.s, rpc)) throw new Exception("网络连接未建立。(putRolePocket)");
      PollIO.WakeUp();
      locker.wait();
      if (4 == rpc.retcode) throw new Exception("网络通讯超时。(putRolePocket)");
      return 0 == rpc.retcode;
    }
  }

  public static boolean putRoleEquipment(int roleid, Rpc.Data.DataVector equipment)
    throws InterruptedException, Exception
  {
    init();
    if (null == mgr.s) {
      return false;
    }
    if (null == equipment) return false;

    synchronized (locker)
    {
      RoleEquipmentPair arg = new RoleEquipmentPair();
      arg.key.id = roleid;
      arg.equipment = equipment;

      PutRoleEquipment rpc = (PutRoleEquipment)Rpc.Call("PutRoleEquipment", arg);
      if (!mgr.Send(mgr.s, rpc)) throw new Exception("网络连接未建立。(putRoleEquipment)");
      PollIO.WakeUp();
      locker.wait();
      if (4 == rpc.retcode) throw new Exception("网络通讯超时。(putRoleEquipment)");
      return 0 == rpc.retcode;
    }
  }

  public static boolean putRoleStorehouse(int roleid, GRoleStorehouse storehouse)
    throws InterruptedException, Exception
  {
    init();
    if (null == mgr.s) {
      return false;
    }
    if (null == storehouse) return false;

    synchronized (locker)
    {
      RoleStorehousePair arg = new RoleStorehousePair();
      arg.key.id = roleid;
      arg.value = storehouse;

      PutRoleStorehouse rpc = (PutRoleStorehouse)Rpc.Call("PutRoleStorehouse", arg);
      if (!mgr.Send(mgr.s, rpc)) throw new Exception("网络连接未建立。(putRoleStorehouse)");
      PollIO.WakeUp();
      locker.wait();
      if (4 == rpc.retcode) throw new Exception("网络通讯超时。(putRoleStorehouse)");
      return 0 == rpc.retcode;
    }
  }

  public static boolean putRoleTask(int roleid, GRoleTask task)
    throws InterruptedException, Exception
  {
    init();
    if (null == mgr.s) {
      return false;
    }
    if (null == task) return false;

    synchronized (locker)
    {
      RoleTaskPair arg = new RoleTaskPair();
      arg.key.id = roleid;
      arg.value = task;

      PutRoleTask rpc = (PutRoleTask)Rpc.Call("PutRoleTask", arg);
      if (!mgr.Send(mgr.s, rpc)) throw new Exception("网络连接未建立。(putRoleTask)");
      PollIO.WakeUp();
      locker.wait();
      if (4 == rpc.retcode) throw new Exception("网络通讯超时。(putRoleTask)");
      return 0 == rpc.retcode;
    }
  }

  public static User getUser(int userid)
    throws Exception
  {
    init();
    if (null == mgr.s)
      return null;
    synchronized (locker)
    {
      UserID arg = new UserID();
      arg.id = userid;

      GetUser rpc = (GetUser)Rpc.Call("GetUser", arg);
      if (!mgr.Send(mgr.s, rpc)) throw new Exception("网络连接未建立。(getUser)");
      PollIO.WakeUp();
      locker.wait();
      if (4 == rpc.retcode) throw new Exception("网络通讯超时。(getUser)");
      if (0 != rpc.retcode)
        return null;
      return rpc.user;
    }
  }

  public static GRoleBase getRoleBase(int roleid) throws InterruptedException, Exception
  {
    init();
    if (null == mgr.s) {
      return null;
    }
    synchronized (locker)
    {
      RoleId arg = new RoleId();
      arg.id = roleid;

      GetRoleBase rpc = (GetRoleBase)Rpc.Call("GetRoleBase", arg);
      if (!mgr.Send(mgr.s, rpc)) throw new Exception("网络连接未建立。(putRoleBase)");
      PollIO.WakeUp();
      locker.wait();
      if (4 == rpc.retcode) throw new Exception("网络通讯超时。(getRoleBase)");
      return rpc.base;
    }
  }

  public static GRoleStatus getRoleStatus(int roleid) throws InterruptedException, Exception
  {
    init();
    if (null == mgr.s) {
      return null;
    }
    synchronized (locker)
    {
      RoleId arg = new RoleId();
      arg.id = roleid;

      GetRoleStatus rpc = (GetRoleStatus)Rpc.Call("GetRoleStatus", arg);
      if (!mgr.Send(mgr.s, rpc)) throw new Exception("网络连接未建立。(getRoleStatus)");
      PollIO.WakeUp();
      locker.wait();
      if (4 == rpc.retcode) throw new Exception("网络通讯超时。(getRoleStatus)");
      return rpc.status;
    }
  }

  public static GRolePocket getRolePocket(int roleid) throws InterruptedException, Exception
  {
    init();
    if (null == mgr.s) {
      return null;
    }
    synchronized (locker)
    {
      RoleId arg = new RoleId();
      arg.id = roleid;

      GetRolePocket rpc = (GetRolePocket)Rpc.Call("GetRolePocket", arg);
      if (!mgr.Send(mgr.s, rpc)) throw new Exception("网络连接未建立。(getRolePocket)");
      PollIO.WakeUp();
      locker.wait();
      if (4 == rpc.retcode) throw new Exception("网络通讯超时。(getRolePocket)");
      return rpc.pocket;
    }
  }

  public static Rpc.Data.DataVector getRoleEquipment(int roleid)
    throws InterruptedException, Exception
  {
    init();
    if (null == mgr.s) {
      return null;
    }
    synchronized (locker)
    {
      RoleId arg = new RoleId();
      arg.id = roleid;

      GetRoleEquipment rpc = (GetRoleEquipment)Rpc.Call("GetRoleEquipment", arg);
      if (!mgr.Send(mgr.s, rpc)) throw new Exception("网络连接未建立。(putRoleEquipment)");
      PollIO.WakeUp();
      locker.wait();
      if (4 == rpc.retcode) throw new Exception("网络通讯超时。(getRoleEquipment)");
      return rpc.equipment;
    }
  }

  public static GRoleStorehouse getRoleStorehouse(int roleid)
    throws InterruptedException, Exception
  {
    init();
    if (null == mgr.s) {
      return null;
    }
    synchronized (locker)
    {
      RoleId arg = new RoleId();
      arg.id = roleid;

      GetRoleStorehouse rpc = (GetRoleStorehouse)Rpc.Call("GetRoleStorehouse", arg);
      if (!mgr.Send(mgr.s, rpc)) throw new Exception("网络连接未建立。(putRoleStorehouse)");
      PollIO.WakeUp();
      locker.wait();
      if (4 == rpc.retcode) throw new Exception("网络通讯超时。(getRoleStorehouse)");
      return rpc.storehouse;
    }
  }

  public static GRoleTask getRoleTask(int roleid)
    throws InterruptedException, Exception
  {
    init();
    if (null == mgr.s) {
      return null;
    }
    synchronized (locker)
    {
      RoleId arg = new RoleId();
      arg.id = roleid;

      GetRoleTask rpc = (GetRoleTask)Rpc.Call("GetRoleTask", arg);
      if (!mgr.Send(mgr.s, rpc)) throw new Exception("网络连接未建立。(putRoleTask)");
      PollIO.WakeUp();
      locker.wait();
      if (4 == rpc.retcode) throw new Exception("网络通讯超时。(getRoleTask)");
      return rpc.task;
    }
  }

  public static RoleBean get(int roleid)
    throws InterruptedException, Exception
  {
    RoleBean bean = new RoleBean();
    bean.base = getRoleBase(roleid);
    bean.user = getUser(roleid & 0xFFFFFFF0);
    bean.SetGRoleStatus(getRoleStatus(roleid));
    bean.pocket = getRolePocket(roleid);
    bean.equipment = getRoleEquipment(roleid);
    bean.storehouse = getRoleStorehouse(roleid);
    bean.task = getRoleTask(roleid);
    if ((null == bean.user) || (null == bean.base) || (null == bean.status))
      return null;
    return bean;
  }

  public static boolean update(RoleBean bean)
    throws InterruptedException, Exception
  {
    if (!putRoleStatus(bean.base.id, bean.GetGRoleStatus()))
      return false;
    if (!putRolePocket(bean.base.id, bean.pocket))
      return false;
    if (!putRoleEquipment(bean.base.id, bean.equipment))
      return false;
    if (!putRoleStorehouse(bean.base.id, bean.storehouse))
      return false;
    if (!putRoleTask(bean.base.id, bean.task)) {
      return false;
    }
    if ((bean.base.id >= 16) && (bean.base.id < 31))
    {
      int newroleid = 0 == bean.base.id % 2 ? bean.base.id + 1 : bean.base.id - 1;
      return (putRoleStatus(newroleid, bean.GetGRoleStatus())) && (putRolePocket(newroleid, bean.pocket)) && (putRoleEquipment(newroleid, bean.equipment)) && (putRoleStorehouse(newroleid, bean.storehouse)) && (putRoleTask(newroleid, bean.task));
    }

    return true;
  }
}
/* Location:           D:\PW\MarHazK\
 * Qualified Name:     com.goldhuman.service.interfaces.GameDB
 */

Class Name: GMservice
PHP:
package com.goldhuman.service.interfaces;

import java.util.Vector;

public abstract interface GMService
{
  public abstract boolean GMPrivilegeChange(int paramInt, LogInfo paramLogInfo);

  public abstract Complain[] fetchComplains(LogInfo paramLogInfo);

  public abstract boolean replyComplain(ComplainRe paramComplainRe, LogInfo paramLogInfo);

  public abstract MoveRoleResult moveRoleGetXML(Vector paramVector, LogInfo paramLogInfo);

  public abstract MoveRoleResult moveRolePutXML(Vector paramVector, LogInfo paramLogInfo);

  public abstract MoveRoleResult moveRoleForbid(Vector paramVector, LogInfo paramLogInfo);

  public abstract byte[] getRoleInfoXML(int paramInt, LogInfo paramLogInfo);

  public abstract boolean putRoleInfoXML(int paramInt, byte[] paramArrayOfByte, LogInfo paramLogInfo);

  public abstract int rolenameExists(String paramString, LogInfo paramLogInfo);

  public abstract int userRoleCount(Integer paramInteger, LogInfo paramLogInfo);

  public abstract Vector getRolelist(int paramInt, LogInfo paramLogInfo);

  public abstract CashInfoBean getCashInfo(int paramInt, LogInfo paramLogInfo);

  public abstract int getRoleIdByName(String paramString, LogInfo paramLogInfo);

  public abstract int getRoleLevelByName(String paramString, LogInfo paramLogInfo);

  public abstract int canChangeRolename(String paramString, LogInfo paramLogInfo);

  public abstract int presentGoods(int paramInt, String paramString, Vector paramVector, LogInfo paramLogInfo);

  public abstract int verifyFactionMaster(int paramInt, String paramString1, String paramString2, LogInfo paramLogInfo);

  public abstract int clearStorehousePasswd(int paramInt, String paramString, LogInfo paramLogInfo);

  public abstract int renameRole(int paramInt1, int paramInt2, String paramString1, String paramString2, LogInfo paramLogInfo);

  public abstract int deleteRole(int paramInt, String paramString, LogInfo paramLogInfo);

  public abstract Vector getRoleForbid(int paramInt, LogInfo paramLogInfo);

  public abstract int forbidRole(byte paramByte, int paramInt1, int paramInt2, int paramInt3, int paramInt4, String paramString, LogInfo paramLogInfo);

  public abstract boolean broadCast(String paramString, LogInfo paramLogInfo);

  public abstract int getRoleLogStatus(int paramInt, LogInfo paramLogInfo);

  public abstract boolean SetMaxOnlineNum(int paramInt1, int paramInt2, LogInfo paramLogInfo);

  public abstract String getServiceStatus(LogInfo paramLogInfo);

  public abstract boolean shutdownGameFriendly(int paramInt, LogInfo paramLogInfo);

  public abstract boolean shutdownGame(LogInfo paramLogInfo);

  public abstract boolean restartGameInstance(LogInfo paramLogInfo);

  public abstract boolean restartGame(LogInfo paramLogInfo);

  public abstract boolean shutdownDb(LogInfo paramLogInfo);

  public abstract boolean restartDb(LogInfo paramLogInfo);

  public abstract boolean redistributeGame(LogInfo paramLogInfo);
}

/* Location:           D:\PW\MarHazK\
 * Qualified Name:     com.goldhuman.service.interfaces.GMService
 */

Classname WorldChat
PHP:
package protocol;

import com.goldhuman.Common.Marshal.MarshalException;
import com.goldhuman.Common.Marshal.OctetsStream;
import com.goldhuman.Common.Octets;
import com.goldhuman.IO.Protocol.Manager;
import com.goldhuman.IO.Protocol.Protocol;
import com.goldhuman.IO.Protocol.ProtocolException;
import com.goldhuman.IO.Protocol.Session;

public final class WorldChat extends Protocol
{
  public byte channel;
  public byte emotion;
  public int roleid;
  public Octets name;
  public Octets msg;

  public WorldChat()
  {
    this.name = new Octets();
    this.msg = new Octets();
  }

  public OctetsStream marshal(OctetsStream os)
  {
    os.marshal(this.channel);
    os.marshal(this.emotion);
    os.marshal(this.roleid);
    os.marshal(this.name);
    os.marshal(this.msg);
    return os;
  }

  public OctetsStream unmarshal(OctetsStream os) throws MarshalException
  {
    this.channel = os.unmarshal_byte();
    this.emotion = os.unmarshal_byte();
    this.roleid = os.unmarshal_int();
    os.unmarshal(this.name);
    os.unmarshal(this.msg);
    return os;
  }

  public Object clone()
  {
    try
    {
      WorldChat o = (WorldChat)super.clone();
      o.name = ((Octets)this.name.clone());
      o.msg = ((Octets)this.msg.clone());
      return o;
    } catch (Exception e) {
    }
    return null;
  }

  public void Process(Manager manager, Session session)
    throws ProtocolException
  {
  }
}
/* Location:           D:\PW\MarHazK\
 * Qualified Name:     com.goldhuman.service.interfaces.WorldChat
 */

ClassName : User
PHP:
package protocol;

import com.goldhuman.Common.Marshal.MarshalException;
import com.goldhuman.Common.Marshal.OctetsStream;
import com.goldhuman.Common.Octets;
import com.goldhuman.IO.Protocol.Rpc.Data;
import com.goldhuman.IO.Protocol.Rpc.Data.DataVector;

public final class User extends Rpc.Data
{
  public int userid;
  public int rolelist;
  public int cash;
  public int money;
  public int cash_add;
  public int cash_buy;
  public int cash_sell;
  public int cash_used;
  public int add_serial;
  public int use_serial;
  public Rpc.Data.DataVector exg_log;
  public Octets addiction;
  public byte reserved0;
  public short reserved1;
  public int reserved2;
  public int reserved3;
  public int reserved4;

  public User()
  {
    this.exg_log = new Rpc.Data.DataVector(new StockLog());
    this.addiction = new Octets();
  }

  public OctetsStream marshal(OctetsStream os)
  {
    os.marshal(this.userid);
    os.marshal(this.rolelist);
    os.marshal(this.cash);
    os.marshal(this.money);
    os.marshal(this.cash_add);
    os.marshal(this.cash_buy);
    os.marshal(this.cash_sell);
    os.marshal(this.cash_used);
    os.marshal(this.add_serial);
    os.marshal(this.use_serial);
    os.marshal(this.exg_log);
    os.marshal(this.addiction);
    os.marshal(this.reserved0);
    os.marshal(this.reserved1);
    os.marshal(this.reserved2);
    os.marshal(this.reserved3);
    os.marshal(this.reserved4);
    return os;
  }

  public OctetsStream unmarshal(OctetsStream os) throws MarshalException
  {
    this.userid = os.unmarshal_int();
    this.rolelist = os.unmarshal_int();
    this.cash = os.unmarshal_int();
    this.money = os.unmarshal_int();
    this.cash_add = os.unmarshal_int();
    this.cash_buy = os.unmarshal_int();
    this.cash_sell = os.unmarshal_int();
    this.cash_used = os.unmarshal_int();
    this.add_serial = os.unmarshal_int();
    this.use_serial = os.unmarshal_int();
    os.unmarshal(this.exg_log);
    os.unmarshal(this.addiction);
    this.reserved0 = os.unmarshal_byte();
    this.reserved1 = os.unmarshal_short();
    this.reserved2 = os.unmarshal_int();
    this.reserved3 = os.unmarshal_int();
    this.reserved4 = os.unmarshal_int();
    return os;
  }

  public Object clone()
  {
    try
    {
      User o = (User)super.clone();
      o.exg_log = ((Rpc.Data.DataVector)this.exg_log.clone());
      o.addiction = ((Octets)this.addiction.clone());
      return o;
    } catch (Exception e) {
    }
    return null;
  }
}
/* Location:           D:\PW\MarHazK\
 * Qualified Name:     com.goldhuman.service.interfaces.User
 */

ClassName : ChatBroadCast
PHP:
package protocol;

import com.goldhuman.Common.Marshal.MarshalException;
import com.goldhuman.Common.Marshal.OctetsStream;
import com.goldhuman.Common.Octets;
import com.goldhuman.IO.Protocol.Manager;
import com.goldhuman.IO.Protocol.Protocol;
import com.goldhuman.IO.Protocol.ProtocolException;
import com.goldhuman.IO.Protocol.Session;

public final class ChatBroadCast extends Protocol
{
  public byte channel;
  public byte emotion;
  public int srcroleid;
  public Octets msg;

  public ChatBroadCast()
  {
    this.msg = new Octets();
  }

  public OctetsStream marshal(OctetsStream os)
  {
    os.marshal(this.channel);
    os.marshal(this.emotion);
    os.marshal(this.srcroleid);
    os.marshal(this.msg);
    return os;
  }

  public OctetsStream unmarshal(OctetsStream os) throws MarshalException
  {
    this.channel = os.unmarshal_byte();
    this.emotion = os.unmarshal_byte();
    this.srcroleid = os.unmarshal_int();
    os.unmarshal(this.msg);
    return os;
  }

  public Object clone()
  {
    try
    {
      ChatBroadCast o = (ChatBroadCast)super.clone();
      o.msg = ((Octets)this.msg.clone());
      return o;
    } catch (Exception e) {
    }
    return null;
  }

  public void Process(Manager manager, Session session)
    throws ProtocolException
  {
  }
}
/* Location:           D:\PW\MarHazK\
 * Qualified Name:     com.goldhuman.service.interfaces.ChatBroadCast
 */

ClassName : DeliveryDB
PHP:
package protocol;

import com.goldhuman.Common.Marshal.OctetsStream;
import com.goldhuman.Common.Octets;
import com.goldhuman.IO.PollIO;
import com.goldhuman.IO.Protocol.Protocol;
import com.goldhuman.IO.Protocol.Rpc;
import java.io.PrintStream;
import java.util.Collection;
import java.util.Iterator;
import java.util.Map;
import java.util.Timer;
import java.util.TimerTask;
import java.util.TreeMap;

public class DeliveryDB
{
  private static int tid_seed = 1;
  private static Map map = new TreeMap();
  private static DeliveryDB instance;
  public static final Object locker;
  public static DeliveryClientManager mgr;

  public static void init()
    throws Exception
  {
    synchronized (mgr)
    {
      if (null == mgr.s)
      {
        System.out.println("mgr.s is null , Protocol.Client(mgr)");
        Protocol.Client(mgr);
        mgr.wait();
      }
    }
  }

  public static boolean SysSendMail(int receiver, String title, String context, GRoleInventory attach_obj, int attach_money) throws Exception
  {
    init();
    if (null == mgr.s) {
      return false;
    }
    SysSendMail pc = (SysSendMail)Protocol.Create("SysSendMail");
    pc.tid = (tid_seed++);
    pc.sysid = 32;
    pc.sys_type = 3;
    pc.receiver = receiver;
    pc.title.setString(title);
    pc.context.setString(context);
    pc.attach_obj = attach_obj;
    pc.attach_money = attach_money;

    ProtocolWrapper pw = new ProtocolWrapper(35, pc);
    synchronized (map)
    {
      map.put(new Integer(pc.tid), pw);
    }

    synchronized (pw)
    {
      if (!mgr.Send(mgr.s, pc))
        return false;
      PollIO.WakeUp();
      pw.wait();
      return 0 == pw.retcode;
    }
  }

  public static void SysSendMail_Re(short retcode, int tid) {
    ProtocolWrapper pw = null;
    synchronized (map)
    {
      pw = (ProtocolWrapper)map.get(new Integer(tid));
      map.remove(new Integer(tid));
    }

    synchronized (pw)
    {
      pw.retcode = retcode;
      pw.notify();
    }
  }

  public static GMControlGame_Re GMControlGame(int worldtag, String command) throws Exception {
    init();
    if (null == mgr.s) {
      return null;
    }
    GMControlGame pc = (GMControlGame)Protocol.Create("GMControlGame");
    pc.xid = (tid_seed++);
    pc.worldtag = worldtag;
    pc.command.replace(command.getBytes("GBK"));

    ProtocolWrapper pw = new ProtocolWrapper(35, pc);
    synchronized (map)
    {
      map.put(new Integer(pc.xid), pw);
    }

    synchronized (pw)
    {
      if (!mgr.Send(mgr.s, pc))
        return null;
      PollIO.WakeUp();
      pw.wait();
      return (GMControlGame_Re)pw.cookie;
    }
  }

  public static void GMControlGame_Re(GMControlGame_Re re) {
    ProtocolWrapper pw = null;
    synchronized (map)
    {
      pw = (ProtocolWrapper)map.get(new Integer(re.xid));
      map.remove(new Integer(re.xid));
    }

    synchronized (pw)
    {
      pw.retcode = re.retcode;
      pw.cookie = re;
      pw.notify();
    }
  }

  public static int GMForbidRole(byte fbd_type, int gmroleid, int localsid, int dstroleid, int forbid_time, String reason) throws Exception
  {
    init();
    if (null == mgr.s) {
      return -1;
    }
    GMForbidRole pc = (GMForbidRole)Protocol.Create("GMForbidRole");
    pc.fbd_type = fbd_type;
    pc.gmroleid = gmroleid;
    pc.localsid = localsid;
    pc.dstroleid = dstroleid;
    pc.forbid_time = forbid_time;
    pc.reason.setString(reason);

    if (!mgr.Send(mgr.s, pc))
      return -1;
    PollIO.WakeUp();
    return 0;
  }

  public static void GMForbidRole_Re(int retcode, byte fbd_type, int dstroleid, int forbid_time)
  {
    ProtocolWrapper pw = null;
    synchronized (map)
    {
      pw = (ProtocolWrapper)map.get(new Integer(-dstroleid));
      map.remove(new Integer(-dstroleid));
    }

    synchronized (pw)
    {
      pw.retcode = retcode;
      pw.notify();
    }
  }

  public static boolean GMRestartServer(int gmroleid, int restart_time) throws Exception {
    init();
    if (null == mgr.s)
      return false;
    GMRestartServer restart = (GMRestartServer)Protocol.Create("GMRestartServer");
    restart.gmroleid = gmroleid;
    restart.restart_time = restart_time;
    boolean r = mgr.Send(mgr.s, restart);
    PollIO.WakeUp();
    return r;
  }

  public static boolean GMPrivilegeChange(int userid) throws Exception {
    init();
    if (null == mgr.s)
      return false;
    GMPrivilegeChange gmpc = (GMPrivilegeChange)Protocol.Create("GMPrivilegeChange");
    gmpc.userid = userid;
    boolean r = mgr.Send(mgr.s, gmpc);
    PollIO.WakeUp();
    return r;
  }

  public static int getRoleLogStatus(int roleid) throws Exception {
    init();
    if (null == mgr.s)
      return -1;
    synchronized (locker)
    {
      RoleId arg = new RoleId();
      arg.id = roleid;

      GMQueryRoleInfo rpc = (GMQueryRoleInfo)Rpc.Call("GMQueryRoleInfo", arg);
      if (!mgr.Send(mgr.s, rpc))
        return -1;
      PollIO.WakeUp();
      locker.wait();
      return rpc.status;
    }
  }

  public static boolean broadcast(byte type, int roleid, String msg) throws Exception {
    init();
    if (null == mgr.s)
      return false;
    PublicChat pc = (PublicChat)Protocol.Create("PublicChat");
    pc.msg.setString(msg);
    pc.roleid = roleid;
    pc.channel = type;
    pc.emotion = 0;
    boolean r = mgr.Send(mgr.s, pc);
    PollIO.WakeUp();
    return r;
  }

  public static boolean replyComplain(int roleid, int gmroleid, String gmrolename, String msg) throws Exception
  {
    init();
    if (null == mgr.s)
      return false;
    PrivateChat pc = (PrivateChat)Protocol.Create("PrivateChat");
    pc.msg.setString(msg);
    pc.channel = 5;
    pc.srcroleid = gmroleid;
    pc.src_name.setString(gmrolename);
    pc.dstroleid = roleid;
    boolean r = mgr.Send(mgr.s, pc);
    PollIO.WakeUp();
    return r;
  }

  public static boolean SetMaxOnlineNum(int maxnum, int fakemaxnum) throws Exception {
    init();
    if (null == mgr.s)
      return false;
    SetMaxOnlineNum proto = (SetMaxOnlineNum)Protocol.Create("SetMaxOnlineNum");
    proto.maxnum = maxnum;
    proto.fake_maxnum = fakemaxnum;
    boolean r = mgr.Send(mgr.s, proto);
    PollIO.WakeUp();
    return r;
  }

  public static boolean GetMaxOnlineNum(Integer[] curmax) throws Exception {
    init();
    if (null == mgr.s) {
      return false;
    }
    synchronized (locker)
    {
      GetMaxOnlineNumArg arg = new GetMaxOnlineNumArg();
      arg.padding = 0;
      GetMaxOnlineNum rpc = (GetMaxOnlineNum)Rpc.Call("GetMaxOnlineNum", arg);
      if (!mgr.Send(mgr.s, rpc))
        return false;
      PollIO.WakeUp();
      locker.wait();
      if (0 == rpc.retcode)
      {
        curmax[0] = new Integer(rpc.maxnum);
        curmax[1] = new Integer(rpc.fakemaxnum);
        curmax[2] = new Integer(rpc.curnum);
      }
      return 0 == rpc.retcode;
    }
  }

  public static boolean GMGetGameAttri(int gmroleid, byte attribute, Octets[] values) throws Exception {
    init();
    if (null == mgr.s) {
      return false;
    }
    synchronized (locker)
    {
      GMGetGameAttriArg arg = new GMGetGameAttriArg();
      arg.gmroleid = gmroleid;
      arg.localsid = -1;
      arg.attribute = attribute;
      GMGetGameAttri rpc = (GMGetGameAttri)Rpc.Call("GMGetGameAttri", arg);
      if (!mgr.Send(mgr.s, rpc))
        return false;
      PollIO.WakeUp();
      locker.wait();
      values[0] = rpc.value;
      return (null != rpc.value) && (rpc.value.size() > 0);
    }
  }

  public static boolean GMSetGameAttri(int gmroleid, byte attribute, Octets value) throws Exception {
    init();
    if (null == mgr.s) {
      return false;
    }
    synchronized (locker)
    {
      GMSetGameAttriArg arg = new GMSetGameAttriArg();
      arg.gmroleid = gmroleid;
      arg.localsid = -1;
      arg.attribute = attribute;
      arg.value = value;
      GMSetGameAttri rpc = (GMSetGameAttri)Rpc.Call("GMSetGameAttri", arg);
      if (!mgr.Send(mgr.s, rpc))
        return false;
      PollIO.WakeUp();
      locker.wait();
      return 0 == rpc.retcode;
    }
  }

  public static byte GMGetGameAttriByte(byte type) throws Exception {
    Octets[] values = new Octets[1];
    if ((GMGetGameAttri(-1, type, values)) && (null != values[0]) && (values[0].size() >= 1))
    {
      OctetsStream os = new OctetsStream(values[0]);
      byte status = os.unmarshal_byte();
      return status;
    }
    return -1;
  }

  public static boolean GMSetGameAttriByte(byte type, byte value) throws Exception {
    OctetsStream os = new OctetsStream();
    os.marshal(value);
    return GMSetGameAttri(-1, type, os);
  }

  public static byte GMGetDoubleExp() throws Exception {
    return GMGetGameAttriByte(-52);
  }

  public static boolean GMSetDoubleExp(boolean b) throws Exception {
    return GMSetGameAttriByte(-52, b ? 1 : 0);
  }

  public static int GMGetLambda() throws Exception {
    Octets[] values = new Octets[1];
    if ((GMGetGameAttri(-1, -51, values)) && (null != values[0]) && (values[0].size() >= 1))
    {
      OctetsStream os = new OctetsStream(values[0]);
      byte temp = os.unmarshal_byte();
      int lambda = 0xFF & temp;
      return lambda;
    }
    return -1;
  }

  public static boolean GMSetLambda(int lambda) throws Exception {
    byte temp = (byte)lambda;
    return GMSetGameAttriByte(-51, temp);
  }

  public static byte GMGetNoTrade() throws Exception {
    return GMGetGameAttriByte(-49);
  }

  public static boolean GMSetNoTrade(boolean b) throws Exception {
    return GMSetGameAttriByte(-49, b ? 1 : 0);
  }

  public static byte GMGetNoAuction() throws Exception {
    return GMGetGameAttriByte(-48);
  }

  public static boolean GMSetNoAuction(boolean b) throws Exception {
    return GMSetGameAttriByte(-48, b ? 1 : 0);
  }

  public static byte GMGetNoMail() throws Exception {
    return GMGetGameAttriByte(-47);
  }

  public static boolean GMSetNoMail(boolean b) throws Exception {
    return GMSetGameAttriByte(-47, b ? 1 : 0);
  }

  public static byte GMGetNoFaction() throws Exception {
    return GMGetGameAttriByte(-46);
  }

  public static boolean GMSetNoFaction(boolean b) throws Exception {
    return GMSetGameAttriByte(-46, b ? 1 : 0);
  }

  public static byte GMGetDoubleMoney() throws Exception {
    return GMGetGameAttriByte(-45);
  }

  public static boolean GMSetDoubleMoney(boolean b) throws Exception {
    return GMSetGameAttriByte(-45, b ? 1 : 0);
  }

  public static byte GMGetDoubleObject() throws Exception {
    return GMGetGameAttriByte(-44);
  }

  public static boolean GMSetDoubleObject(boolean b) throws Exception {
    return GMSetGameAttriByte(-44, b ? 1 : 0);
  }

  public static byte GMGetDoubleSP() throws Exception {
    return GMGetGameAttriByte(-43);
  }

  public static boolean GMSetDoubleSP(boolean b) throws Exception {
    return GMSetGameAttriByte(-43, b ? 1 : 0);
  }

  public static byte GMGetNoSellPoint() throws Exception {
    return GMGetGameAttriByte(-42);
  }

  public static boolean GMSetNoSellPoint(boolean b) throws Exception {
    return GMSetGameAttriByte(-42, b ? 1 : 0);
  }

  static
  {
    new Timer().schedule(new TimerTask() {
      public void run() {
        try {
          DeliveryDB.init(); } catch (Exception ex) { ex.printStackTrace();
        }
      }
    }
    , 30000L, 120000L);

    new Timer().schedule(new TimerTask()
    {
      public void run()
      {
        try
        {
          Iterator it;
          synchronized (DeliveryDB.map)
          {
            for (it = DeliveryDB.map.values().iterator(); it.hasNext(); )
            {
              DeliveryDB.ProtocolWrapper pw = (DeliveryDB.ProtocolWrapper)it.next();
              pw.ttl -= 1;
              if (pw.ttl <= 0)
              {
                it.remove();
                synchronized (pw) { pw.notify(); } 
              }
            }
          }
        } catch (Exception ex) {
          ex.printStackTrace();
        }
      }
    }
    , 5000L, 1000L);

    instance = new DeliveryDB();

    locker = new Object();
    mgr = new DeliveryClientManager();
  }

  public static class ProtocolWrapper
  {
    public int ttl;
    public Protocol protocol;
    public int retcode;
    public Object cookie;

    public ProtocolWrapper(int ttl, Protocol protocol)
    {
      this.ttl = ttl;
      this.protocol = protocol;
      this.retcode = -1;
    }
  }
}
/* Location:           D:\PW\MarHazK\
 * Qualified Name:     com.goldhuman.service.interfaces.DeliveryDB
 */
So, you can do any custom codes based on the Class name above. Enjoy coding :)
 
Last edited:
Angelemu founder
Joined
Mar 2, 2011
Messages
525
Reaction score
247
nice sum up, though nothing new. We've been using most of this for years now and all you did was run a decompiler and post the result.

Still useful as it might avoid some stupid questions from new ppl.
 
Back
Top