*L2J_JP構築メモ [#r56e57ec]
低消費電力、静音なPPC Mac miniでL2Jサーバを走らせる。
-参考サイト
--http://svn.tslroom.net/
--http://tslroom.svnrepository.com/cgi-bin/trac.cgi/timeline
--http://chickenkatu.hp.infoseek.co.jp/l2j/

-必要なツール類
--Java 1.5 … L2JはJavaで記述されている。MacOSX 10.4 Tigerに付属。
--Eclipse … Javaの統合開発環境セット
--MySQL … データベース
--phpMyAdmin … WEBブラウザからデータベース管理を行うツール。MacOSXに付属するApache、PHPと連携して動作する。~
~
~
*下準備 [#m476f1e1]
**Tigerへアップグレード(MacOSX 10.3.9 → 10.4.6) [#d17d2528]
-J2SE 5.0 (Java 1.5)~
MacOSX(Tiger)に付属します。Tigerへアップグレード(2006/6/1)~

-個人メモ(L2Jの構築とは無関係です)
--LaunchDaemons関連のトラブル発生
---postfixの対策 … http://tetralog.mydns.jp:8080/t/?date=20050525
---%% postfixの対策 … http://www.david-reitter.com/software/osxpostfix.html %%
---dovecotの対策 … http://wiki.dovecot.org/DovecotServerInstallations/MacOSX/10.4.6/2Users
**MySQL 4.1 [#ubb787d8]
-mysql-standard-4.1.20-apple-darwin8.6.0-powerpc.dmg をダウンロード … [[ここ:http://dev.mysql.com/downloads/mysql/4.1.html]]から ~
-次の3つのファイルをインストール
--mysql-standard-4.1.20-apple-darwin8.6.0-powerpc.pkg
--MySQLStartupItems.pkg
--MySQL.prefPane … システム環境設定からMySQLの制御が可能になる。
-/etc/php.iniへソケットの場所を指定
#pre{{
# cp /etc/php.ini.default /etc/php.ini
}}
/etc/php.iniの661行目付近を修正
#pre{{
mysql.default_socket = &color(red){/tmp/mysql.sock};
}}
システム環境設定→共有の「パーソナルWEB共有」を再起動すればOKです。

-〜/.profileへパス設定を追加
#pre{{
PATH=/opt/local/bin:/usr/local/mysql/bin:$PATH
}}
パス設定を反映~
#pre{{
$ . ~/profile
}}
-動作確認
#pre{{
$ mysqlshow
+-----------+
| Databases |
+-----------+
| test      |
+-----------+
}}
**phpMyAdmin [#cf34f488]
-http://www.phpmyadmin.net/home_page/index.php をインストール
-/etc/php.iniの修正が必要(MySQL 4.1を参照)
**Eclipse [#bd7852cd]
-Eclipse 3.2RC6 - Mac OSX (Mac/Carbon)版をダウンロードして展開
--http://download.eclipse.org/eclipse/downloads/drops/S-3.2RC6-200605260010/index.php
-日本語化パッチ pleiades_0.95.zip を http://mergedoc.sourceforge.jp/ から頂いてきて解凍する。~
readme.txtに従い、~

--jp.sourceforge.mergedoc.pleiadesディレクトリをEclipseのpluginディレクトリへ格納。
--eclipse.ini (Eclipse.app/Contents/MacOS/eclipse.ini)の最終行へ下記を追加~
jarファイルを&color(red){絶対パス};で指定するのがミソ。~
#pre{{
-javaagent:/Aplications/eclipse/plugins/jp.sourceforge.mergedoc.pleiades/pleiades.jar
}}
-subclipseのインストール。(下記を参考にして。)~
http://server.seasar.org/manual/install_subclipse.html
**L2J_JPサーバの作成 [#a78a31a0]
-ソースの取得~
全てをEclipse上で行う。~
まずEclipseを起動し、画面右下のSVNリポジトリを右クリックして、リポジトリーロケーションを選択する。~
&ref(svn1.png,nolink);~
~
サーバを指定する。~
&ref(svn2.png,nolink);~
~
リポジトリL2J_JPを右クリックしてチェックアウトを選択する。~
&ref(svn3.png,nolink);~
~
オプションを聞かれたら、
「プロジェクトとしてワークスペースへチェックアウト」を選択する。~
~
-ビルド~
「パッケージエクスポローラー」の中のL2J_JPを選択して、~
画面上部のボタン「実行 L2J_JP build.xml」を押せばOKです。~
&ref(build1.png,nolink);~
~
「BUILD SUCCESSFUL」と表示されればビルドは終了です。(私のMacminiでは9分ほどかかりました。)~
~
-L2Jサーバの設置~
〜/Document/workspace/L2J_JP/build/dist フォルダがL2J_JPのサーバ環境一式になります。~
サーバの設置場所(どこでもOK)を決めてそこにコピーしておきましょう。~
#pre{{
$ cp -R ~/Document/workspace/L2J_JP/dist ~/L2J_JP
}}
-シェルスクリプトに実行属性を付加
#pre{{
$ cd ~/L2J_JP
$ find . -name "*.sh" -exec chmod +x {} \;
}}
**L2J_JPデータベースの作成 [#s9d5c9a4]
-キャラクタ名を日本語表示するための設定~
/etc/my.cnfを用意(存在しないなら)~
#pre{{
$ sudo cp /usr/local/mysql/support-files/my-medium.cnf /etc/my.cnf 
}}
/etc/my.cnf の [mysqld]、[mysql]の項へ文字コードの設定を追加。その設定を反映させるべくMySQLサーバを再起動する。~
#pre{{
[mysqld]
&color(red){default-character-set=utf8};

[mysql]
&color(red){default-character-set=sjis};
}}
データベース l2jdb の作成と文字コードの確認~
#pre{{
$ mysql -u root
mysql> create database l2jdb character set &color(red){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;
}}
-データベーステーブル/コンテンツの作成
#pre{{
$ cd ~/L2J_LP/gameserver/tools
$ ./database_installer.sh
}}
**L2J_JPサーバの設定 [#yae1d115]
-ネットワーク/MySQLアカウントの設定~
&color(red){外部と接続する場合は、MySQLのuser/passwd等をちゃんと設定しましょう。};
#pre{{
■ ~/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
}}
~
-ゲームサーバの登録
#pre{{
$ 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: &color(red){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へ登録する。
#pre{{
$ cp hexid\(server 1\).txt ../gameserver/config/hexid.txt
}}

-ルータのポートフォワード~
下記ポートをMac miniへフォーワードするようにルータを設定する。~
&color(red){実際私は外に繋いでないので間違っているかもしれませんが};~
--TCP 7777
--UDP 7777
--TCP 2106
--UDP 2106

-L2J_JPサーバの起動
#pre{{
$ cd ~/L2J_JP/login
$ ./startLoginServer.sh

$ cd ~/L2J_JP/gameserver
$ ./startGameServer.sh

}}
**L2J_JPゲームパラメータの設定(お好みに応じて) [#ta00a00c]
-jp_addonの適用(正しいかどうか自身ないけど・・・)~
#pre{{
$ cd ~/L2J_JP/gameserver/jp_addon
$ mysql -u root l2jdb < sql/itemname_jp.sql
$ mysql -u root l2jdb < sql/l2whdb.sql
$ mysql -u root l2jdb < sql/updates_item.sql
$ mysql -u root l2jdb < sql/updates_npc.sql

$ mysql -u root l2jdb < custum_sql_by_viento/sql/armor.sql
$ mysql -u root l2jdb < custum_sql_by_viento/sql/etcitem.sql
$ mysql -u root l2jdb < custum_sql_by_viento/sql/minions.sql
$ mysql -u root l2jdb < custum_sql_by_viento/sql/npc.sql
$ mysql -u root l2jdb < custum_sql_by_viento/sql/raidboss_spawnlist.sql
$ mysql -u root l2jdb < custum_sql_by_viento/sql/random_spawn.sql
$ mysql -u root l2jdb < custum_sql_by_viento/sql/random_spawn_loc.sql
$ mysql -u root l2jdb < custum_sql_by_viento/sql/spawnlist.sql
$ mysql -u root l2jdb < custum_sql_by_viento/sql/weapon.sql
$ mysql -u root l2jdb < custum_sql_by_viento/sql_for_add/minions_C3AreaBoss.sql
$ mysql -u root l2jdb < custum_sql_by_viento/sql_for_add/minions_C3GroupMob.sql

$ cp -R data/* ../data

#rev 303と314のアップデートを実行する。
$ mysql -u root l2jdb < ~/L2J_JP/gameserver/sql/updates/20060613-\[303\].sql
$ mysql -u root l2jdb < ~/L2J_JP/gameserver/sql/updates/20060619-\[314\].sql
}}

-パラメータいじり~
#pre{{
■ ~/L2J_JP/gameserver/config/rates.properties
RateXP = 20                       # 敵からの経験値(XP)を20倍に
RateSP = 20                       # 敵からのスキルポイント?(SP)を20倍に 
RatePartyXP = 5                   # パーティ行動時にはXP、さらに5倍
RatePartySP = 5                   # パーティ行動時にはSP、さらに5倍

RateDropAdera = 1000              # 敵が落とすアデナ(お金)を1000倍
RateConsumableCost = 1.           # 消費剤(ss/sps/矢等)の売買コスト
RateDropItems = 100               # 敵が落とすアイテム率、100倍
RateDropSpoil = 3                 # Dwarf専用スキル、スポイルの成功確立を3倍

PlayerDropLimit = 0               # 死亡時、アイテムを落さない。(最大0個落とす)
PlayerRateDrop = 0                # 死亡時、ドロップ率0
KarmaDropLimit = 0                # PKキャラ死亡時、アイテムを落さない。(最大0個落とす)
KarmaRateDrop = 0                 # PKキャラ死亡時、ドロップ率0

# ドロップ成立時の、アイテム、装備品、武器の3つのうちどれを落とすか?の確率(3合計で100)
# 本例ではドロップ率が0なので、実質意味をなしてない。
KarmaRateDropItem = 10         # アイテムを10%の確立で落とす
KarmaRateDropEquip = 40           # 装備品を40%の確立で落とす
KarmaRateDropEquipWeapon = 50     # 武器を50%の確立で落とす

■ ~/L2J_JP/gameserver/config/altsettings.properties
Delevel = Fales                   # レベルや経験値(XP)が下がるペナルティの無効化
AltGameExponentXP = 5             # レベル差に応じてXPを分配
AltGameExponentSP = 5             # レベル差に応じてSPを分配
AltGameCanselByHit = cast         # 敵攻撃により魔法詠唱がキャンセルされる(Falseにするとキャンセルなし)
SpBookNeeded = False              # スキル取得の際、魔法書が不要になる
AltGameSkillLearn = False         # Trueにすると全種族/クラスのスキルを取得できるようになる。
AltSubClassWithoutQuests = True   # クエストなしでサブクラスになれる

■ ~/L2J_JP/gameserver/config/jp-custom.properties
AltChangeable3rdClass = True      # 3次転職を可能にする

■ ~/L2J_JP/gameserver/config/options.properties
ZoneTown = 1
DeleteCharAfterDays = 1           # キャラクタ削除時、1日の猶予期間が与えられる。
MaxDriftRange = 200               # default 200
AllowRentPet = True
AllowFishing = True

■ ~/L2J_JP/gameserver/config/other.properties
StartingAdena = 2000000000        # キャラクタ作成時の初期アデナ(通貨)の量

WyvernSpeed = 500                 # ワイバーン(飛竜)の移動速度5倍(default 100)
StriderSpeed = 500                # ストラーダ(歩行竜)の移動速度5倍(default 80)

UseDeepBlueDropRules = False

MaximumSlotsForNoDwarf = 160      # 種族Dwarf以外の手持ちアイテム数
MaximumSlotsForDwarf = 200        # 種族Dwarfの手持ちアイテム数
MaximumSlotsForGMPlayer = 500     # GMの手持ちアイテム数

EnchantCance = 100                # エンチャントの成功率を100%に
EnchantMax = 200                  # +200までエンチャント可能(+200まで武器/防具を強化可能)

HpRegenMultiplier = 200           # HPの自然回復速度200%
MpRegenMultiplier = 200           # MPの自然回復速度200%
CpRegenMultiplier = 200           # CPの自然回復速度200%

RaidHpRegenMultiplier = 50        # RaidボスのHPの自然回復速度50%
RaidMpRegenMultiplier = 50        # RaidボスのMPの自然回復速度50%
RaidDefenceMultiplier = 20        # Raidボスの防御力          20%

UnstuckInterval = 300

RespawnRestoreCP = 90             # 復活時、総CP値の90%を回復する。
RespawnRestoreHP = 90             # 復活時、総HP値の90%を回復する。
RespawnRestoreMP = 90             # 復活時、総MP値の90%を回復する。
}}

-GMショップの設置~
--http://svn.tslroom.net/ の [[GM SHOP:http://svn.tslroom.net/forum/viewtopic.php?t=9]] からダウンロード。~
--ReadMe.txt に従い、8031.html を所定の場所に格納。
--GMショップのデータをl2jdpへ反映させます。
#pre{{
$ mysql -u root l2jdb < ダウンロードした/gm_shop/gm_shop.SQL
}}
-GMキャラ~
--作り方~
データベースを直接編集して普通に作ったキャラクタをGMキャラへ昇格させる。~
具体的には、phpMyAdminのようなデータベース管理ツールを使って、
---データベース l2jdb 中の
---accounts テーブルの 該当アカウントの access_level を 100 へ、さらに、
---characters テーブルの 該当キャラの accesslevel を 100 へ変更すればOK
--コマンド~
GMキャラで冒険中に、チャットウインドウへ次のコマンドを入力すると管理ツールが出現する。~
#pre{{
//admin
}}

-タヌキなアイテム … アイテムカスタマイズの例~
「タヌキの耳」を装備すると、最大CP/HP/MP、命中率、クリティカル、攻撃速度、魔法速度が30%向上する。~
他、HPドレイン10%のおまけ付。~
#pre{{
--- 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 ) 
#pre{{
--- 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 )
#pre{{
--- 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個まで追加できるようにする。
#pre{{
--- 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(" + &color(red){…省略…};
                             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(改) … メインクラスで習得したスキルをサブクラスで使用できるようにする。~
#pre{{
--- 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(ボツ) … メインクラスで習得したスキルをサブクラスで使用できるようにする。%%~
#pre{{
--- 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,&color(red){MAX(skill_level) AS skill_level}; FROM character_skills WHERE char_obj_id=? AND &color(red){( 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 … メイン、サブで習得したすべてのスキルを使用できるようにする。%%
#pre{{
--- 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,&color(red){MAX(skill_level) AS skill_level}; FROM character_skills WHERE char_obj_id=? AND &color(red){( 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 … メイン、サブで習得したすべてのスキルを使用できるようにする。
#pre{{
--- 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武器を使う。(装備、床置き、倉庫出し入れが可能になる)~
#pre{{
--- 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)
}}

//-スクリーンショット~
//&ref(vara3.jpg,nolink);~
//~


#navi(Mac mini);

トップ   編集 差分 バックアップ 添付 複製 名前変更 リロード   新規 一覧 単語検索 最終更新   ヘルプ   最終更新のRSS