2019年9月15日 星期日

耀武神兵

找  
src/l1j/server/server/model/item/action/Enchant.java



// 對武器施法的卷軸
public static void scrollOfEnchantWeapon(L1PcInstance pc, L1ItemInstance l1iteminstance
, L1ItemInstance l1iteminstance1, ClientThread client) {
int itemId = l1iteminstance.getItem().getItemId();
int safe_enchant = l1iteminstance1.getItem().get_safeenchant();
int weaponId = l1iteminstance1.getItem().getItemId();
if ((l1iteminstance1 == null) || (l1iteminstance1.getItem().getType2() != 1)
|| (safe_enchant < 0) || (l1iteminstance1.getBless() >= 128)) {
pc.sendPackets(new S_ServerMessage(79));
return;
}


這段的最下方加入....



//TODO 耀武 BY 80363000
if ((weaponId >= 289) && (weaponId <= 303)) { // 當耀武
if (itemId != L1ItemId.Yaowu) { // 使用非耀武卷軸時
pc.sendPackets(new S_ServerMessage(79));//將顯示沒有效果
return;
}
}
if (itemId == L1ItemId.Yaowu) { // 當使用耀武卷軸
if ((weaponId < 289) || (weaponId > 303)) { // 點非耀武時
pc.sendPackets(new S_ServerMessage(79));
return;
}
}//耀武 END



/src/l1j/server/server/model/identity/L1ItemId.java


加入


/** 耀武神兵強化卷軸*/
public static final int Yaowu = 161036;


/src/l1j/server/server/clientpackets/C_ItemUSe.java



case 40077:

上方加入


case L1ItemId.Yaowu://TODO 耀武神兵強化卷軸


L1ItemInstance l1iteminstance1 = pc.getInventory().getItem(l);
_log.finest("request item use (obj) = " + itemObjid + " action = "
+ l + " value = " + s);
if ((itemId == 40077)
|| (itemId == L1ItemId.SCROLL_OF_ENCHANT_WEAPON)
|| (itemId == L1ItemId.SCROLL_OF_ENCHANT_QUEST_WEAPON)
|| (itemId == 40130) || (itemId == 140130)
|| (itemId == L1ItemId.B_SCROLL_OF_ENCHANT_WEAPON)
|| (itemId == L1ItemId.C_SCROLL_OF_ENCHANT_WEAPON)
|| (itemId == 40128)) { // 對武器施法的卷軸
Enchant.scrollOfEnchantWeapon(pc, l1iteminstance,
l1iteminstance1, client);


中間加入


|| (itemId == L1ItemId.Yaowu)//耀武卷軸




完成!!


此設定為非官方設定
(正服活動期間使用特定卷軸強化,活動結束後使用一般武卷就可以強化)
單純爽度製作


2019年9月3日 星期二

生存吶喊系統

一共有以下三個地方會動到

src/l1j/server/server/clientpackets/C_LoginToServer.java
src/l1j/server/server/model/Instance/L1PcInstance.java
src/l1j/server/server/clientpackets/C_Rank.java

首先

src/l1j/server/server/clientpackets/C_LoginToServer.java



} else {
pc.setDead(true);
pc.setStatus(ActionCodes.ACTION_Die);
}

下方找位置加入

if (pc.get_food() >= 225) {//TODO LOLI 生存吶喊
final Calendar cal = Calendar.getInstance();
long h_time = cal.getTimeInMillis() / 1000;//TODO 換算為秒
pc.set_h_time(h_time);//TODO 紀錄登入時間
}







src/l1j/server/server/model/Instance/L1PcInstance.java

最下方加入

private long _h_time;//TODO 生存吶喊時間

/**
* 生存吶喊時間
* @return
*/
public long get_h_time() {
return _h_time;
}

/**
* 生存吶喊時間
* @param h_time
*/
public void set_h_time(long h_time) {
_h_time = h_time;
}



src/l1j/server/server/clientpackets/C_Rank.java

全部改成

/*
 * This program is free software; you can redistribute it and/or modify
 * it under the terms of the GNU General Public License as published by
 * the Free Software Foundation; either version 2, or (at your option)
 * any later version.
 *
 * This program is distributed in the hope that it will be useful,
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 * GNU General Public License for more details.
 *
 * You should have received a copy of the GNU General Public License
 * along with this program; if not, write to the Free Software
 * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA
 * 02111-1307, USA.
 *
 * http://TODOwww.gnu.org/copyleft/gpl.html
 */

package l1j.server.server.clientpackets;

import java.util.Calendar;
import java.util.Random;
import java.util.logging.Level;
import java.util.logging.Logger;

import l1j.server.server.ClientThread;
import l1j.server.server.datatables.CharacterTable;
import l1j.server.server.model.L1Clan;
import l1j.server.server.model.L1World;
import l1j.server.server.model.Instance.L1PcInstance;
import l1j.server.server.serverpackets.S_PacketBox;
import l1j.server.server.serverpackets.S_ServerMessage;
import l1j.server.server.serverpackets.S_SkillSound;

public class C_Rank extends ClientBasePacket {

private static final String C_RANK = "[C] C_Rank";
private static Logger _log = Logger.getLogger(C_Rank.class.getName());

public C_Rank(byte abyte0[], ClientThread clientthread)
throws Exception {
super(abyte0);

int data = readC();
int rank = readC();
String name = readS();

L1PcInstance pc = clientthread.getActiveChar();
L1PcInstance targetPc = L1World.getInstance().getPlayer(name);

if (pc == null) {
return;
}

switch (data) {
case 1:
L1Clan clan = L1World.getInstance().getClan(pc.getClanname());
if (clan == null) {
return;
}

if ((rank < 1) && (3 < rank)) {
//TODO 請輸入想要變更階級的人的名稱與階級。[階級 = 守護騎士、一般、見習]
pc.sendPackets(new S_ServerMessage(781));
return;
}

if (pc.isCrown()) { //TODO 君主
if (pc.getId() != clan.getLeaderId()) { //TODO 血盟主
pc.sendPackets(new S_ServerMessage(785)); //TODO 你不再是君主了
return;
}
} else {
pc.sendPackets(new S_ServerMessage(518)); //TODO 血盟君主才可使用此命令。
return;
}

if (targetPc != null) {
if (pc.getClanid() == targetPc.getClanid()) {
try {
targetPc.setClanRank(rank);
targetPc.save();
targetPc.sendPackets(new S_PacketBox(S_PacketBox.MSG_RANK_CHANGED, rank));
}
catch (Exception e) {
_log.log(Level.SEVERE, e.getLocalizedMessage(), e);
}
} else {
pc.sendPackets(new S_ServerMessage(201, name)); //TODO %0 不是你的血盟成員
return;
}
} else {
L1PcInstance restorePc = CharacterTable.getInstance().restoreCharacter(name);
if ((restorePc != null) && (restorePc.getClanid() == pc.getClanid())) {
try {
restorePc.setClanRank(rank);
restorePc.save();
}
catch (Exception e) {
_log.log(Level.SEVERE, e.getLocalizedMessage(), e);
}
} else {
pc.sendPackets(new S_ServerMessage(109, name));//TODO 沒有叫%0的人。
return;
}
}
break;
case 2:
case 3:
case 4:
break;

case 5://生存吶喊(CTRL+E)
if (pc.getWeapon() == null) {
pc.sendPackets(new S_ServerMessage(1973));
return;
}
if (pc.getCurrentHp() >= pc.getMaxHp()) {
pc.sendPackets(new S_ServerMessage(1974));//TODO 還無法使用生存的吶喊。
return;
}
if (pc.get_food() >= 225 && pc.getWeapon() != null) {
final Random random = new Random();
long time = pc.get_h_time();
final Calendar cal = Calendar.getInstance();
long h_time = cal.getTimeInMillis() / 1000;//TODO 換算為秒
int n = (int) ((h_time - time) / 60);//TODO 換算為分
int Gfxid_1 = 0;
int Gfxid_2 = 0;
int addhp = 0;
if (n <= 0) {
pc.sendPackets(new S_ServerMessage(1974));//TODO 還無法使用生存的吶喊。
return;
} else if (n >= 1 && n <= 29) {
Gfxid_1 = 8907;
Gfxid_2 = 8683;
addhp = (int) (pc.getMaxHp() * (double)(n / 100.0D));

} else if (n >= 30) {
int lv = pc.getWeapon().getEnchantLevel();
if (lv <= 0 || (lv >= 1 && lv <= 6)) {
Gfxid_1 = 8907;
Gfxid_2 = 8684;
addhp = (int) (pc.getMaxHp() * (double)((random.nextInt(20) + 20) / 100.0D));
} else if (lv == 7 || lv == 8){
Gfxid_1 = 8909;
Gfxid_2 = 8685;
addhp = (int) (pc.getMaxHp() * (double)((random.nextInt(20) + 30) / 100.0D));
} else if (lv == 9 || lv == 10) {
Gfxid_1 = 8910;
Gfxid_2 = 8773;
addhp = (int) (pc.getMaxHp() * (double)((random.nextInt(10) + 50) / 100.0D));
} else if (lv  >= 11) {
Gfxid_1 = 8908;
Gfxid_2 = 8686;
addhp = (int) (pc.getMaxHp() * (double)(0.7));
}

S_SkillSound spr1 = new S_SkillSound(pc.getId(), Gfxid_1);
S_SkillSound spr2 = new S_SkillSound(pc.getId(), Gfxid_2);
pc.sendPackets(spr1);
pc.broadcastPacket(spr1);
pc.sendPackets(spr2);
pc.broadcastPacket(spr2);
}

if (addhp != 0) {
pc.set_food((short) 0);
pc.sendPackets(new S_PacketBox(S_PacketBox.FOOD, (short) 0));
pc.setCurrentHp(pc.getCurrentHp() + addhp);
}
}
break;

case 6://生存吶喊(Alt+0)
if (pc.getWeapon() == null) {
pc.sendPackets(new S_ServerMessage(1973));//TODO 必須裝備上武器才可使用。
return;
}
int lv = pc.getWeapon().getEnchantLevel();
int gfx = 8684;
if (lv <= 0 || (lv >= 1 && lv <= 6)) {
gfx = 8684;
} else if (lv == 7 || lv == 8){
gfx = 8685;
} else if (lv == 9 || lv == 10) {
gfx = 8773;
} else if (lv  >= 11) {
gfx = 8686;
}
S_SkillSound spr = new S_SkillSound(pc.getId(), gfx);
pc.sendPackets(spr);
pc.broadcastPacket(spr);
break;
}
}

@Override
public String getType() {
return C_RANK;
}
}


完成 by 80363000

2017年9月8日 星期五

敵對陣營系統-ok



NpcTable

Integer hostileFamily = _familyTypes.get(rs.getString("hostile_family"));//敵對陣營
if (hostileFamily == null) {
npc.set_hostileFamily(0);
} else {
npc.set_hostileFamily(hostileFamily.intValue());
}


L1Npc

// 敵對陣營
private int _hostileFamily;
public int get_hostileFamily() {
return _hostileFamily;
}
public void set_hostileFamily(int i) {
_hostileFamily = i;
}
// 敵對陣營 end


L1MonsterInstance




// ターゲットを探す
public static int[][] _classGfxId = { { 0, 1 }, { 48, 61 }, { 37, 138 },
{ 734, 1186 }, { 2786, 2796 } };



// 闘技場内は変身/未変身に限らず全てアクティブ

這段上面之前

改成


@Override
//TODO 敵對系統 by80363000
    public void searchTarget() {
        // ターゲット捜索
        L1PcInstance targetPlayer = null;  
        // 加入搜索敵對陣營為目標
        L1MonsterInstance targetNpc = null;
        int thisNpcFamily = getNpcTemplate().get_hostileFamily();
        if (thisNpcFamily != 0) {//有設定敵對陣營才需要搜索
                int map = getMapId();
                Point npcpt = getLocation();
                for (L1Object object : L1World.getInstance().getObject()) {
                        if (object instanceof L1MonsterInstance) {
                                L1MonsterInstance tgnpc = (L1MonsterInstance) object;
                                if (tgnpc.getNpcTemplate().get_family() == thisNpcFamily) {
                                        if (map != tgnpc.getMapId()) {
                           continue;
                    }
                                        if (tgnpc != null && tgnpc.getCurrentHp() > 0 && !tgnpc.isDead() && npcpt.isInScreen(tgnpc.getLocation())) {
                               targetNpc = tgnpc;
                                           break;
                        }
                                }
                        }
                }
        }

        for (L1PcInstance pc : L1World.getInstance().getVisiblePlayer(this)) {
                if (pc.getCurrentHp() <= 0 || pc.isDead() || pc.isGm()
                                || pc.isMonitor() || pc.isGhost()) {
                        continue;
                }//TODO 敵對系統 by80363000 end



之後找

// リンクの設定
@Override
public void setLink(L1Character cha) {
if ((cha != null) && _hateList.isEmpty()) { // ターゲットがいない場合のみ追加
_hateList.add(cha, 0);
checkTarget();
}
}

上面追加

        //TODO 敵對系統 by80363000
        if (targetNpc != null) {
            _hateList.add(targetNpc, 0);
                _target = targetNpc;
        } else if (targetPlayer != null) {
                _hateList.add(targetPlayer, 0);
                _target = targetPlayer;
        }





2017年8月11日 星期五

天堂伺服器架設教學

天堂伺服器架設教學


準備:

※手上沒有版本的朋友就不用再看了,這裡目前不提供版本。

架設前須準備三套軟體:

  1. Java             (建立伺服器環境架構與啟動的東西)
  2. MySQL         (安裝伺服器的東西)
  3. Navicat         (修改遊戲內容的東西)
此為以上三種的下載點(W7  64位元版)→Google雲端下載點←←(2019更新)




安裝:
Java (安裝設定好大概只要5分鐘)
初學者不知道要怎麼去安裝的話,建議一路  下一步 就好了,安裝好之後開始設定
安裝後.請確認安裝資料夾之路徑!環境變數設定將用到.
例如:C:\Program Files\Java\jdk1.7.0_06
\電腦\內容\進階系統設定\進階\環境變數\系統變數\

[JAVA_HOME]
[C:\Program Files\Java\jdk1.7.0_06]

[path]
[%JAVA_HOME%\bin;]

[CLASSPATH]
%JAVA_HOME%\lib\dt.jar;%JAVA_HOME%\lib\tools.jar; ]

以上三項.如\系統變數\
裡頭沒有的話.請 新增 .
如有現成的.請選擇 編輯 欄項在最後頭加上參數.並先加上分號 ; 不空格

完成以上步驟!來驗證安裝.參數設定是否正確

執行\cmd\javac

如看到一堆指令.即表示JAVA的環境變數已設定成功。

日後如要更新版本.只需安裝JDK後.修改版本號即可.
[JAVA_HOME]
[C:\Program Files\Java\jdk1.7.0_XX]








MySQL(安裝設定好大概只要3分鐘)
初學者不知道要怎麼去安裝的話,建議一路  下一步 就好了,安裝好之後開始設定













Navicat(安裝設定好大概只要3分鐘)

初學者不知道要怎麼去安裝的話,建議一路  下一步 就好了,安裝好之後開始設定

打開Navicat 檔案新增連線密碼填寫root→連線測試確定


2.左邊出現新連線localhost 
     右鍵點localhost→開啓連線新增資料庫名稱打上l1jdb



3.左邊出現新資料庫l1jdb
右鍵點l1jdb→執行批次任務檔案找到剛剛解壓縮模擬器DB資料夾裏的l1jdb_MyISAM_big5.sql文件加打開選擇→l1jdb載入









伺服器架設好之後就是登入器了

設定








最後開啟你的伺服器

2016年9月7日 星期三

血魔突破32767[成功!]
















C_CommonClick


// ↓ 最大血量修改
if (currenthp < 1) {
currenthp = 1;
} else if (currenthp > 2147483647) {
currenthp = 2147483647;
}

int currentmp = rs.getInt("CurMp");

if (currentmp < 1) {
currentmp = 1;
} else if (currentmp > 2147483647) {
currentmp = 2147483647;
}
// end


C_Attr


  case 322: // 是否要復活? (Y/N) c = readC(); L1PcInstance resusepc2 = (L1PcInstance) L1World.getInstance().findObject(pc.getTempID()); pc.setTempID(0); if (resusepc2 != null) { // 祝福された 復活スクロール、リザレクション、グレーター リザレクション if (c == 0) { // No } else if (c == 1) { // Yes resurrection( pc, resusepc2, (short) pc.getMaxHp()); // EXPロストしている、G-RESを掛けられた、EXPロストした死亡 // 全てを満たす場合のみEXP復旧 if (pc.getExpRes() == 1 && pc.isGres() && pc.isGresValid()) { pc.resExp(); pc.setExpRes(0); pc.setGres(false); } } } break;

L1Character


private short _maxHp = 0; // ● MAXHP(1~32767)

private int _trueMaxHp = 0; // ● 本当のMAXHP

public short getMaxHp() {
return _maxHp;
}

public void setMaxHp(int hp) {
_trueMaxHp = hp;
_maxHp = (short) IntRange.ensure(_trueMaxHp, 1, 32767);
_currentHp = Math.min(_currentHp, _maxHp);
}

public void addMaxHp(int i) {
setMaxHp(_trueMaxHp + i);
}

private short _maxMp = 0; // ● MAXMP(0~32767)

private int _trueMaxMp = 0; // ● 本当のMAXMP

public short getMaxMp() {
return _maxMp;
}

public void setMaxMp(int mp) {
_trueMaxMp = mp;
_maxMp = (short) IntRange.ensure(_trueMaxMp, 0, 32767);
_currentMp = Math.min(_currentMp, _maxMp);
}

public void addMaxMp(int i) {
setMaxMp(_trueMaxMp + i);
}

改成

// 血魔破萬修改
private int _maxHp = 0; // ● MAXHP(1~32767)
private int _trueMaxHp = 0; // ● 本当のMAXHP

public int getMaxHp() {
return _maxHp;
}

public void setMaxHp(int hp) {
_trueMaxHp = hp;
_maxHp = (int) IntRange.ensure(_trueMaxHp, 1, 2147483647);
_currentHp = Math.min(_currentHp, _maxHp);
}

public void addMaxHp(int i) {
setMaxHp(_trueMaxHp + i);
}

private int _maxMp = 0; // ● MAXMP(0~32767)
private int _trueMaxMp = 0; // ● 本当のMAXMP

public int getMaxMp() {
return _maxMp;
}

public void setMaxMp(int mp) {
_trueMaxMp = mp;
_maxMp = (int ) IntRange.ensure(_trueMaxMp, 0, 2147483647);
_currentMp = Math.min(_currentMp, _maxMp);
}

public void addMaxMp(int i) {
setMaxMp(_trueMaxMp + i);
}

L1PcInstance


private short _baseMaxHp = 0; // ● MAXHPベース(1~32767)

public short getBaseMaxHp() {
return _baseMaxHp;
}

public void addBaseMaxHp(short i) {
i += _baseMaxHp;
if (i >= 32767) {
i = 32767;
}
else if (i < 1) {
i = 1;
}
addMaxHp(i - _baseMaxHp);
_baseMaxHp = i;
}

private short _baseMaxMp = 0; // ● MAXMPベース(0~32767)

public short getBaseMaxMp() {
return _baseMaxMp;
}

public void addBaseMaxMp(short i) {
i += _baseMaxMp;
if (i >= 32767) {
i = 32767;
}
else if (i < 0) {
i = 0;
}
addMaxMp(i - _baseMaxMp);
_baseMaxMp = i;
}

改成

 /* HP.MP上限直達2147483647 by dens */ private int _baseMaxHp = 0; // ● MAXHPベース(1~32767) public int getBaseMaxHp() { return _baseMaxHp; } public void addBaseMaxHp(int i) { i += _baseMaxHp; if (i >= 2147483647) { i = 2147483647; } else if (i < 1) { i = 1; } addMaxHp(i - _baseMaxHp); _baseMaxHp = i; } private int _baseMaxMp = 0; // ● MAXMPベース(0~32767) public int getBaseMaxMp() { return _baseMaxMp; } public void addBaseMaxMp(int i) { i += _baseMaxMp; if (i >= 2147483647) { i = 2147483647; } else if (i < 0) { i = 0; } addMaxMp(i - _baseMaxMp); _baseMaxMp = i; } /* end */


S_HPUpdate

整個改成

/**
 *                            License
 * THE WORK (AS DEFINED BELOW) IS PROVIDED UNDER THE TERMS OF THIS
 * CREATIVE COMMONS PUBLIC LICENSE ("CCPL" OR "LICENSE").
 * THE WORK IS PROTECTED BY COPYRIGHT AND/OR OTHER APPLICABLE LAW.
 * ANY USE OF THE WORK OTHER THAN AS AUTHORIZED UNDER THIS LICENSE OR
 * COPYRIGHT LAW IS PROHIBITED.
 *
 * BY EXERCISING ANY RIGHTS TO THE WORK PROVIDED HERE, YOU ACCEPT AND
 * AGREE TO BE BOUND BY THE TERMS OF THIS LICENSE. TO THE EXTENT THIS LICENSE
 * MAY BE CONSIDERED TO BE A CONTRACT, THE LICENSOR GRANTS YOU THE RIGHTS CONTAINED
 * HERE IN CONSIDERATION OF YOUR ACCEPTANCE OF SUCH TERMS AND CONDITIONS.
 *
 */
package l1j.server.server.serverpackets;

import l1j.server.server.Opcodes;
import l1j.server.server.model.Instance.L1PcInstance;
import l1j.server.server.utils.IntRange;

public class S_HPUpdate extends ServerBasePacket {

private static final IntRange hpRange = new IntRange(1, 2147483647); // 血魔破萬修改

public S_HPUpdate(int currentHp, int maxHp) {
buildPacket(currentHp, maxHp);
}

public S_HPUpdate(L1PcInstance pc) {
buildPacket(pc.getCurrentHp(), pc.getMaxHp());
}

public void buildPacket(int currentHp, int maxHp) {
writeC(Opcodes.S_OPCODE_HPUPDATE);
writeH(hpRange.ensure(currentHp));
writeH(hpRange.ensure(maxHp));
// writeC(0);
// writeD(GameTimeController.getInstance().getGameTime());
}

@Override
public byte[] getContent() {
return getBytes();
}
}


S_MPUpdate

整個改成

/**
 *                            License
 * THE WORK (AS DEFINED BELOW) IS PROVIDED UNDER THE TERMS OF THIS
 * CREATIVE COMMONS PUBLIC LICENSE ("CCPL" OR "LICENSE").
 * THE WORK IS PROTECTED BY COPYRIGHT AND/OR OTHER APPLICABLE LAW.
 * ANY USE OF THE WORK OTHER THAN AS AUTHORIZED UNDER THIS LICENSE OR
 * COPYRIGHT LAW IS PROHIBITED.
 *
 * BY EXERCISING ANY RIGHTS TO THE WORK PROVIDED HERE, YOU ACCEPT AND
 * AGREE TO BE BOUND BY THE TERMS OF THIS LICENSE. TO THE EXTENT THIS LICENSE
 * MAY BE CONSIDERED TO BE A CONTRACT, THE LICENSOR GRANTS YOU THE RIGHTS CONTAINED
 * HERE IN CONSIDERATION OF YOUR ACCEPTANCE OF SUCH TERMS AND CONDITIONS.
 *
 */
package l1j.server.server.serverpackets;

import l1j.server.server.Opcodes;

public class S_MPUpdate extends ServerBasePacket {
public S_MPUpdate(int currentmp, int maxmp) {
writeC(Opcodes.S_OPCODE_MPUPDATE);

// 血魔破萬修改
if (currentmp < 0) {
writeH(0);
} else if (currentmp > 2147483647) {
writeH(2147483647);
} else {
writeH(currentmp);
}

if (maxmp < 1) {
writeH(1);
} else if (maxmp > 2147483647) {
writeH(2147483647);
} else {
writeH(maxmp);
}
// end

// writeH(currentmp);
// writeH(maxmp);
// writeC(0);
// writeD(GameTimeController.getInstance().getGameTime());
}

@Override
public byte[] getContent() {
return getBytes();
}
}