L2J_JP構築メモ †
低消費電力、静音なPPC Mac miniでL2Jサーバを走らせる。
- 必要なツール類
- Java 1.5 … L2JはJavaで記述されている。MacOSX 10.4 Tigerに付属。
- Eclipse … Javaの統合開発環境セット
- MySQL … データベース
- phpMyAdmin … WEBブラウザからデータベース管理を行うツール。MacOSXに付属するApache、PHPと連携して動作する。
下準備 †
Tigerへアップグレード(MacOSX 10.3.9 → 10.4.6) †
- J2SE 5.0 (Java 1.5)
MacOSX(Tiger)に付属します。Tigerへアップグレード(2006/6/1)
MySQL 4.1 †
phpMyAdmin †
Eclipse †
L2J_JPサーバの作成 †
L2J_JPデータベースの作成 †
- キャラクタ名を日本語表示するための設定
/etc/my.cnfを用意(存在しないなら)
$ sudo cp /usr/local/mysql/support-files/my-medium.cnf /etc/my.cnf
/etc/my.cnf の [mysqld]、[mysql]の項へ文字コードの設定を追加。その設定を反映させるべくMySQLサーバを再起動する。
[mysqld]
default-character-set=utf8
[mysql]
default-character-set=sjis
データベース l2jdb の作成と文字コードの確認
$ mysql -u root
mysql> create database l2jdb character set sjis;
mysql> use l2jdb;
mysql> show variables like 'character\_set\_%';
+--------------------------+-------+
| Variable_name | Value |
+--------------------------+-------+
| character_set_client | sjis |
| character_set_connection | sjis |
| character_set_database | sjis |
| character_set_results | sjis |
| character_set_server | utf8 |
| character_set_system | utf8 |
+--------------------------+-------+
mysql> exit;
- データベーステーブル/コンテンツの作成
$ cd ~/L2J_LP/gameserver/tools
$ ./database_installer.sh
L2J_JPサーバの設定 †
- ネットワーク/MySQLアカウントの設定
外部と接続する場合は、MySQLのuser/passwd等をちゃんと設定しましょう。
■ ~/L2J_JP/login/config/loginserver.properties
InternalHostname = 192.168.1.11 # Mac miniのIP
ExternalHostname = xxxx.ddo.jp # WAN側IPアドレスを指定(ローカルで遊ぶならデフォルトでOK)
login = root # MySQLデータベースのuser
password = # MySQLデータベースのpasswd
■ ~/L2J_JP/gameserver/config/server.properties
InternalHostname = 192.168.1.11 # Mac miniのIP
ExternalHostname = xxxx.ddo.jp # WAN側IPアドレスを指定(ローカルで遊ぶならデフォルトでOK)
login = root # MySQLデータベースのuser
password = # MySQLデータベースのpasswd
- ゲームサーバの登録
$ cd ~/L2J_JP/login
$ ./RegisterGameServer.sh
Enter The id of the server you want to register or type help to get a list of ids:
Your choice: 1 ← 番号は何でも良いらしいがとりあえず1を選択
Server Registered hexid saved to 'hexid(server 1).txt'
Put this file in the /config folder of your gameserver and rename it to 'hexid.txt'
hexidキーをgameserverへ登録する。
$ cp hexid\(server 1\).txt ../gameserver/config/hexid.txt
- ルータのポートフォワード
下記ポートをMac miniへフォーワードするようにルータを設定する。
実際私は外に繋いでないので間違っているかもしれませんが
- TCP 7777
- UDP 7777
- TCP 2106
- UDP 2106
L2J_JPゲームパラメータの設定(お好みに応じて) †
- GMショップの設置
- GMキャラ
- 作り方
データベースを直接編集して普通に作ったキャラクタをGMキャラへ昇格させる。
具体的には、phpMyAdminのようなデータベース管理ツールを使って、
- データベース l2jdb 中の
- accounts テーブルの 該当アカウントの access_level を 100 へ、さらに、
- characters テーブルの 該当キャラの accesslevel を 100 へ変更すればOK
- コマンド
GMキャラで冒険中に、チャットウインドウへ次のコマンドを入力すると管理ツールが出現する。
//admin
- タヌキなアイテム … アイテムカスタマイズの例
「タヌキの耳」を装備すると、最大CP/HP/MP、命中率、クリティカル、攻撃速度、魔法速度が30%向上する。
他、HPドレイン10%のおまけ付。
--- gameserver/data/stats/armor/7600-7699.xml.org 2006-06-04 16:53:46.000000000 +0900
+++ gameserver/data/stats/armor/7600-7699.xml 2006-06-10 19:25:17.000000000 +0900
@@ -3,6 +3,14 @@
<item id='7680' name="Raccoon Ear">
<for>
<add val='0' order='0x10' stat='pDef' />
+ <mul val='1.3' order='0x40' stat='maxCp'/>
+ <mul val='1.3' order='0x40' stat='maxHp'/>
+ <mul val='1.3' order='0x40' stat='maxMp'/>
+ <mul val='1.3' order='0x40' stat='accCombat' />
+ <mul val='1.3' order='0x40' stat='rCrit' />
+ <mul val='1.3' order='0x40' stat='pAtkSpd' />
+ <mul val='1.3' order='0x40' stat='mAtkSpd' />
+ <add stat="absorbDam" val="10" order="0x50"/>
</for>
</item>
<item id='7681' name="Outlaw's Eyepatch">
- Javaソース変更(リビルド要)
- 重量制限を100%まで無効にする。 ( http://svn.tslroom.net/forum/viewtopic.php?t=11 )
--- java/net/sf/l2j/gameserver/model/actor/instance/L2PcInstance.java.orig 2006-06-11 21:21:36.000000000 +0900
+++ java/net/sf/l2j/gameserver/model/actor/instance/L2PcInstance.java 2006-06-11 21:24:59.000000000 +0900
@@ -1478,7 +1478,7 @@
setIsOverloaded(getCurrentLoad() > getMaxLoad());
int weightproc = getCurrentLoad() * 1000 / getMaxLoad();
int newWeightPenalty;
- if ( weightproc < 500) newWeightPenalty = 0;
+ if ( weightproc < 1000) newWeightPenalty = 0;
else if ( weightproc < 666) newWeightPenalty = 1;
else if ( weightproc < 800) newWeightPenalty = 2;
else if ( weightproc < 1000) newWeightPenalty = 3;
- Lv差8以上のレイドボス石化対策 ( http://svn.tslroom.net/forum/viewtopic.php?t=27 )
--- java/net/sf/l2j/gameserver/model/L2Character.java.orig 2006-06-11 21:18:18.000000000 +0900
+++ java/net/sf/l2j/gameserver/model/L2Character.java 2006-06-11 21:19:03.000000000 +0900
@@ -3811,7 +3811,7 @@
activeWeapon.getSkillEffects(this, target, crit);
// Check Raidboss attack
- if (target.isRaid() && getLevel() > target.getLevel() + 8)
+ if (target.isRaid() && getLevel() > target.getLevel() + 80)
{
L2Skill skill = SkillTable.getInstance().getInfo(4515, 99);
@@ -4418,7 +4418,7 @@
}
// Check Raidboss attack
- if (player.isRaid() && getLevel() > player.getLevel() + 8)
+ if (player.isRaid() && getLevel() > player.getLevel() + 80)
{
L2Skill tempSkill = SkillTable.getInstance().getInfo(4515, 99);
if(tempSkill != null)
- サブクラスを10個まで追加できるようにする。
--- java/net/sf/l2j/gameserver/handler/admincommandhandlers/AdminSubClass.java.org
+++ java/net/sf/l2j/gameserver/handler/admincommandhandlers/AdminSubClass.java
@@ -233,7 +233,7 @@ public class AdminSubClass implements IA
else
playerMatrix = new Matrix(objectId, rset.getString("char_name"));
- if (playerMatrix.getNumSubClasses() == 3)
+ if (playerMatrix.getNumSubClasses() == 10)
{
sendReport("WARN", "Warning | Player(" + …省略…
continue;
--- java/net/sf/l2j/gameserver/model/actor/instance/L2PcInstance.java.org
+++ java/net/sf/l2j/gameserver/model/actor/instance/L2PcInstance.java
@@ -6961,7 +6961,7 @@ public final class L2PcInstance extends
*/
public boolean addSubClass(int classId, int classIndex)
{
- if (getTotalSubClasses() == 3 || classIndex == 0)
+ if (getTotalSubClasses() == 10 || classIndex == 0)
return false;
if (getSubClasses().containsKey(classIndex))
--- java/net/sf/l2j/gameserver/model/actor/instance/L2VillageMasterInstance.java.org
+++ java/net/sf/l2j/gameserver/model/actor/instance/L2VillageMasterInstance.java
@@ -143,7 +143,7 @@ public final class L2VillageMasterInstan
{
case 1: // Add Subclass - Initial
// Avoid giving player an option to add a new sub class, if they have three already.
- if (player.getTotalSubClasses() == 3)
+ if (player.getTotalSubClasses() == 10)
{
player.sendMessage("You can now only change one of your current sub classes.");
return;
- スキル拡張その1(改) … メインクラスで習得したスキルをサブクラスで使用できるようにする。
--- java/net/sf/l2j/gameserver/model/actor/instance/L2PcInstance.java.org
+++ java/net/sf/l2j/gameserver/model/actor/instance/L2PcInstance.java
@@ -177,7 +177,10 @@ import net.sf.l2j.util.Point3D;
*/
public final class L2PcInstance extends L2PlayableInstance
{
- private static final String RESTORE_SKILLS_FOR_CHAR = "SELECT skill_id,skill_level FROM character_skills WHERE char_obj_id=? AND class_index=?";
+ private static final String RESTORE_SKILLS_FOR_CHAR = "SELECT skill_id,MAX(skill_level) AS skill_level FROM character_skills "+
+ "WHERE char_obj_id=? AND (class_index=0 AND (skill_name NOT IN "+
+ "(SELECT skill_name FROM character_skills WHERE char_obj_id=? AND class_index=? ) "+
+ ") OR class_index=?) GROUP BY skill_id";
private static final String ADD_NEW_SKILL = "INSERT INTO character_skills (char_obj_id,skill_id,skill_level,skill_name,class_index) VALUES (?,?,?,?,?)";
private static final String UPDATE_CHARACTER_SKILL_LEVEL = "UPDATE character_skills SET skill_level=? WHERE skill_id=? AND char_obj_id=? AND class_index=?";
private static final String DELETE_SKILL_FROM_CHAR = "DELETE FROM character_skills WHERE skill_id=? AND char_obj_id=? AND class_index=?";
@@ -5173,7 +5176,9 @@ public final class L2PcInstance extends
con = L2DatabaseFactory.getInstance().getConnection();
PreparedStatement statement = con.prepareStatement(RESTORE_SKILLS_FOR_CHAR);
statement.setInt(1, getObjectId());
- statement.setInt(2, getClassIndex());
+ statement.setInt(2, getObjectId());
+ statement.setInt(3, getClassIndex());
+ statement.setInt(4, getClassIndex());
ResultSet rset = statement.executeQuery();
// Go though the recordset of this SQL query
スキル拡張その1(ボツ) … メインクラスで習得したスキルをサブクラスで使用できるようにする。
--- java/net/sf/l2j/gameserver/model/actor/instance/L2PcInstance.java.org
+++ java/net/sf/l2j/gameserver/model/actor/instance/L2PcInstance.java
@@ -177,7 +177,7 @@ import net.sf.l2j.util.Point3D;
*/
public final class L2PcInstance extends L2PlayableInstance
{
- private static final String RESTORE_SKILLS_FOR_CHAR = "SELECT skill_id,skill_level FROM character_skills WHERE char_obj_id=? AND class_index=?";
+ private static final String RESTORE_SKILLS_FOR_CHAR = "SELECT skill_id,MAX(skill_level) AS skill_level FROM character_skills WHERE char_obj_id=? AND ( class_index=? OR class_index=0 ) GROUP BY skill_id";
private static final String ADD_NEW_SKILL = "INSERT INTO character_skills (char_obj_id,skill_id,skill_level,skill_name,class_index) VALUES (?,?,?,?,?)";
private static final String UPDATE_CHARACTER_SKILL_LEVEL = "UPDATE character_skills SET skill_level=? WHERE skill_id=? AND char_obj_id=? AND class_index=?";
private static final String DELETE_SKILL_FROM_CHAR = "DELETE FROM character_skills WHERE skill_id=? AND char_obj_id=? AND class_index=?";
スキル拡張その2 … メイン、サブで習得したすべてのスキルを使用できるようにする。
--- java/net/sf/l2j/gameserver/model/actor/instance/L2PcInstance.java.org
+++ java/net/sf/l2j/gameserver/model/actor/instance/L2PcInstance.java
@@ -177,7 +177,7 @@ import net.sf.l2j.util.Point3D;
*/
public final class L2PcInstance extends L2PlayableInstance
{
- private static final String RESTORE_SKILLS_FOR_CHAR = "SELECT skill_id,skill_level FROM character_skills WHERE char_obj_id=? AND class_index=?";
+ private static final String RESTORE_SKILLS_FOR_CHAR = "SELECT skill_id,MAX(skill_level) AS skill_level FROM character_skills WHERE char_obj_id=? AND ( class_index=? OR 1) GROUP BY skill_id";
private static final String ADD_NEW_SKILL = "INSERT INTO character_skills (char_obj_id,skill_id,skill_level,skill_name,class_index) VALUES (?,?,?,?,?)";
private static final String UPDATE_CHARACTER_SKILL_LEVEL = "UPDATE character_skills SET skill_level=? WHERE skill_id=? AND char_obj_id=? AND class_index=?";
private static final String DELETE_SKILL_FROM_CHAR = "DELETE FROM character_skills WHERE skill_id=? AND char_obj_id=? AND class_index=?";
- スキル拡張その2 … メイン、サブで習得したすべてのスキルを使用できるようにする。
--- java/net/sf/l2j/gameserver/model/actor/instance/L2PcInstance.java.org
+++ java/net/sf/l2j/gameserver/model/actor/instance/L2PcInstance.java
@@ -174,7 +177,12 @@ import net.sf.l2j.util.Point3D;
*/
public final class L2PcInstance extends L2PlayableInstance
{
- private static final String RESTORE_SKILLS_FOR_CHAR = "SELECT skill_id,skill_level FROM character_skills WHERE char_obj_id=? AND class_index=?";
+ private static final String RESTORE_SKILLS_FOR_CHAR =
+ "SELECT ( (MIN(ABS(class_index-?)*65536+skill_id ) ) & 0x0000ffff) AS skill_id, "+
+ " ( (MIN(ABS(class_index-?)*65536+skill_level) ) & 0x0000ffff) AS skill_level "+
+ "FROM character_skills "+
+ "WHERE ( class_index=0 OR class_index=? OR ?=0 ) AND char_obj_id=? "+
+ "GROUP BY skill_name ORDER BY skill_id";
private static final String ADD_NEW_SKILL = "INSERT INTO character_skills (char_obj_id,skill_id,skill_level,skill_name,class_index) VALUES (?,?,?,?,?)";
private static final String UPDATE_CHARACTER_SKILL_LEVEL = "UPDATE character_skills SET skill_level=? WHERE skill_id=? AND char_obj_id=? AND class_index=?";
private static final String DELETE_SKILL_FROM_CHAR = "DELETE FROM character_skills WHERE skill_id=? AND char_obj_id=? AND class_index=?";
@@ -5110,8 +5206,11 @@ public final class L2PcInstance extends
// Retrieve all skills of this L2PcInstance from the database
con = L2DatabaseFactory.getInstance().getConnection();
PreparedStatement statement = con.prepareStatement(RESTORE_SKILLS_FOR_CHAR);
- statement.setInt(1, getObjectId());
+ statement.setInt(1, getClassIndex());
statement.setInt(2, getClassIndex());
+ statement.setInt(3, getClassIndex());
+ statement.setInt(4, getClassIndex());
+ statement.setInt(5, getObjectId());
ResultSet rset = statement.executeQuery();
// Go though the recordset of this SQL query
- Hero武器を使う。(装備、床置き、倉庫出し入れが可能になる)
--- java/net/sf/l2j/gameserver/clientpackets/RequestDropItem.java.org
+++ java/net/sf/l2j/gameserver/clientpackets/RequestDropItem.java
@@ -91,7 +91,7 @@ public class RequestDropItem extends Cli
int itemId = item.getItemId();
if ((itemId >= 6611 && itemId <= 6621) || itemId == 6842)
- return;
+ ; // return;
if(_count < 0)
{
--- java/net/sf/l2j/gameserver/clientpackets/SendWareHouseDepositList.java.org
+++ java/net/sf/l2j/gameserver/clientpackets/SendWareHouseDepositList.java
@@ -106,7 +106,7 @@ public class SendWareHouseDepositList ex
int itemId = item.getItemId();
if ((itemId >= 6611 && itemId <= 6621) || itemId == 6842)
- continue;
+ ; // continue;
// Calculate needed adena and slots
if (item.getItemId() == 57) currentAdena -= count;
@@ -145,7 +145,7 @@ public class SendWareHouseDepositList ex
int itemId = oldItem.getItemId();
if ((itemId >= 6611 && itemId <= 6621) || itemId == 6842)
- continue;
+ ; // continue;
L2ItemInstance newItem = player.getInventory().transferItem("Warehouse", objectId, count, warehouse, player, player.getLastFolkNPC());
if (newItem == null)
--- java/net/sf/l2j/gameserver/model/Inventory.java.org
+++ java/net/sf/l2j/gameserver/model/Inventory.java
@@ -546,7 +546,7 @@ public abstract class Inventory extends
L2PcInstance player = (L2PcInstance)getOwner();
if(!player.isGM())
- if (!player.isHero())
+ if(false) // if (!player.isHero())
{
int itemId = item.getItemId();
if ((itemId >= 6611 && itemId <= 6621) || itemId == 6842)
@@ -779,7 +779,7 @@ public abstract class Inventory extends
L2PcInstance player = (L2PcInstance)getOwner();
if(!player.isGM())
- if (!player.isHero())
+ if(false) // if (!player.isHero())
{
int itemId = item.getItemId();
if ((itemId >= 6611 && itemId <= 6621) || itemId == 6842)
|