마방이랑 옵션 완벽 적용
bph에
public byte[] S_Status(L1PcInstance cha, int type){
case 3: // Mr, Sp 설정
TeMp = writeC(Opcodes.S_OPCODE_CHANGE_MR_SP );
TeMp = writeC(0); // 현재 sp설정
TeMp = writeC(cha.get_Mr()); // 현재 Mr 설정
break;
//추가
==================================================================================================
l1캐릭터.
private int _TotalMr; // Mr 의 총 합계
public int get_TotalMr() {
return _Mr + _baseMr;
}
//제가 실험해본결과 마방적용할때 mr과 basemr을 따로이 인식을 하더군영.
//합께 인식하게 만들기 위해 get메소드만 주고 겟토탈mr로 모든 마방관련 데미지 or 확률 검사를 하면 될것 같네영.
아이템 mr+되는것. 아이템테이블에서 젤끝에 인첸트_mr 부분에 설정해놓으시면 됩니다.
==================================================================================================
l1아이템.java
private int enchantmr; // 마법 방어력 +
public int get_enchantmr(){
return enchantmr;
}public void set_enchantmr(int _enchantmr){
enchantmr = _enchantmr;
}
아이템테이블.java
private void allArmor(){
armor.set_EffectID(rs.getInt("effect_id"));
armor.set_enchantmr(rs.getInt("enchant_mr"));//추가.
armor.setIspiles(false);
_armors.put(new Integer(armor.getItemId()), armor);
==================================================================================================
BHP.java 입니다.
public byte[] S_TrageAddItem(L1ItemInstance temp, int count, int type){
생략
무기부분
if(temp.getItem().get_mr() > 0){
TeMp = writeC(15);
TeMp = writeH(temp.getItem().get_mr()+temp.getEnchantLevel()*temp.getItem().get_enchantmr()); //수정
}
방어구부분
if(temp.getItem().get_mr() > 0){
TeMp = writeC(15);
TeMp = writeH(temp.getItem().get_mr()+temp.getEnchantLevel()*temp.getItem().get_enchantmr()); //수정
}
==================================================================================================
item.java 입니다.
public byte[] S_InvList(L1PcInstance _cha){
if(temp[i].getItem().get_mr() > 0){
TeMp = writeC(15);
TeMp = writeH(temp[i].getItem().get_mr()+temp[i].getEnchantLevel()*temp[i].getItem().get_enchantmr());
}
if(temp[i].getItem().get_mr() > 0){
TeMp = writeC(15);
TeMp = writeH(temp[i].getItem().get_mr()+temp[i].getEnchantLevel()*temp[i].getItem().get_enchantmr());
}
public byte[] S_ItemAdd(L1PcInstance cha, L1ItemInstance item){
if(item.getItem().get_mr() > 0){
TeMp = writeC(15);
TeMp = writeH(item.getItem().get_mr()+item.getEnchantLevel()*item.getItem().get_enchantmr());
}
if(item.getItem().get_mr() > 0){
TeMp = writeC(15);
TeMp = writeH(item.getItem().get_mr()+item.getEnchantLevel()*item.getItem().get_enchantmr());
}
public byte[] ItemStatus(L1ItemInstance temp){
if(temp.getItem().get_mr() > 0){
TeMp = writeC(15);
TeMp = writeH(temp.getItem().get_mr()+temp.getEnchantLevel()*temp.getItem().get_enchantmr());
}
if(temp.getItem().get_mr() > 0){
TeMp = writeC(15);
TeMp = writeH(temp.getItem().get_mr()+temp.getEnchantLevel()*temp.getItem().get_enchantmr());
}
==================================================================================================
ItemHandler.java
public void op(L1PcInstance cha, L1ItemInstance item, boolean 체크){
무기 착용부분.
if(item.getItem().get_mr() > 0){
cha.set_Mr(cha.get_Mr() + item.getItem().get_mr() + (item.getEnchantLevel() * item.getItem().get_enchantmr()) );
}
방어구착용부분
if(item.getItem().get_mr() > 0){
cha.set_Mr(cha.get_Mr() + item.getItem().get_mr() + (item.getEnchantLevel() * item.getItem().get_enchantmr()) );
}
//교체.
무기해제부분.
if(item.getItem().get_mr() > 0){
cha.set_Mr(cha.get_Mr() - item.getItem().get_mr() - (item.getEnchantLevel() * item.getItem().get_enchantmr()) );
}
방어구해제부분.
if(item.getItem().get_mr() > 0){
cha.set_Mr(cha.get_Mr() - item.getItem().get_mr() - (item.getEnchantLevel() * item.getItem().get_enchantmr()) );
}
//교체.
==================================================================================================
Item.java
public byte[] S_InvList(L1PcInstance _cha){
if(temp[i].getItem().getType2() == temp[i].getItem().TYPE2_WEAPON){
if((temp[i].getItem().getType1() == temp[i].getItem().WEAPON_TOHANDSWORD) ||
(temp[i].getItem().getType1() == temp[i].getItem().WEAPON_BOW) ||
(temp[i].getItem().getType1() == temp[i].getItem().WEAPON_BLUNT) ||
생략
if(temp[i].getItem().getHitmodifier() > 0){
TeMp = writeC(5);
TeMp = writeC(temp[i].getItem().getHitmodifier());
}
if(temp[i].getItem().getDmgmodifer() > 0){
TeMp = writeC(6);
TeMp = writeC(temp[i].getItem().getDmgmodifer());
}
int sum = temp[i].getItem().get_darkelf() + temp[i].getItem().get_elf() + temp[i].getItem().get_knight() + temp[i].getItem().get_royal() + temp[i].getItem().get_mage();
if(sum > 0){
int darkelf = temp[i].getItem().get_darkelf() != 1 ? 0 : 16;
int elf = temp[i].getItem().get_elf() != 1 ? 0 : 4;
int royal = temp[i].getItem().get_royal() != 1 ? 0 : 1;
int mage = temp[i].getItem().get_mage() != 1 ? 0 : 8;
int knight = temp[i].getItem().get_knight() != 1 ? 0 : 2;
TeMp = writeC(7);
TeMp = writeC(darkelf + elf + royal + mage + knight);
}
if(temp[i].getItem().getAddstr() != 0){
TeMp = writeC(8);
TeMp = writeC(temp[i].getItem().getAddstr());
}
생략
}else if(temp[i].getItem().getType2() == temp[i].getItem().TYPE2_ARMOR){
생략
TeMp = writeC(사이즈(temp[i].getItem().getType2(), temp[i].getItem()));
TeMp = writeC(0x13);
TeMp = writeC(temp[i].getItem().get_ac());
TeMp = writeC(temp[i].getItem().get_material());
TeMp = writeD(temp[i].getItem().getWeight());
if(temp[i].getEnchantLevel() > 0){
TeMp = writeC(0x02);
TeMp = writeC(temp[i].getEnchantLevel());
}
int sum = temp[i].getItem().get_darkelf() + temp[i].getItem().get_elf() + temp[i].getItem().get_knight() + temp[i].getItem().get_royal() + temp[i].getItem().get_mage();
if(sum >0){
int darkelf = temp[i].getItem().get_darkelf() != 1 ? 0 : 16;
int elf = temp[i].getItem().get_elf() != 1 ? 0 : 4;
int royal = temp[i].getItem().get_royal() != 1 ? 0 : 1;
int mage = temp[i].getItem().get_mage() != 1 ? 0 : 8;
int knight = temp[i].getItem().get_knight() != 1 ? 0 : 2;
TeMp = writeC(7);
TeMp = writeC(darkelf + elf + royal + mage + knight);
}
if(temp[i].getItem().getAddstr() != 0){
TeMp = writeC(8);
TeMp = writeC(temp[i].getItem().getAddstr());
}
sum 부분은 착용시에 [왕자/공주][기사][요정][마법사][다크엘프] 나오게 하는것입니다.
본섭에서도 마법망토나 마법방어투구 같은 전클레스 착용 아이템에도 [왕자/공주][기사][요정][마법사][다크엘프]
이렇게 모든 문구가 표기됩니다.
==========================================================================================================
ItemUse.java 입니다.
case 39: // 젤1
if(temp2 != null){ // 아이템이 존재한다면
if(temp2.getItem().getType2() == temp2.getItem().TYPE2_ARMOR){ // 해당 아이템이 방어구라면
if(temp2.getItem().getIsenchant()){ // 인첸이 가능한 아이템이라면
cha.get_cil().CountItem(cha, temp, -1);
if(temp2.getEnchantLevel() < temp2.getItem().get_safenchant()){ // 인첸 가능 레벨보다 작다면
switch(temp.get_bress()){ // 축저주보통의 따라 인첸 하기
case 0: // 축
//[본섭화] 갑옷 마법 인첸트
if(temp2.getEnchantLevel() >= 0 && temp2.getEnchantLevel() <=5){// 갑옷 인첸트가 0 ~ 5 면
BressLv = cha.getRnd().nextInt(3)+1; // 1에서 3의 숫자 랜덤 선택
}else if(temp2.getEnchantLevel() == 6 ){ // 갑옷 인첸트가 6이면
BressLv = cha.getRnd().nextInt(2)+1; // 1에서 2의 숫자 랜덤 선택
}else if(temp2.getEnchantLevel() >= 7 ){ // 갑옷 인첸트가 7이상이면
BressLv =1;
}else{// 그외 갑옷 인첸트가 - 이면
BressLv = cha.getRnd().nextInt(3)+1; // 1에서 3의 숫자 랜덤 선택
}
//[본섭화] 갑옷 마법 인첸트
if(BressLv == 1){
cha.sendPackets(cha.get_netConnection().bph().get_Message().S_ServerMessage(161, "+"+temp2.getEnchantLevel()+" "+temp2.getItem().get_name(), "파랗게", "한순간"), false);
}else{
cha.sendPackets(cha.get_netConnection().bph().get_Message().S_ServerMessage(161, "+"+temp2.getEnchantLevel()+" "+temp2.getItem().get_name(), "파랗게", "잠시"), false);
}
temp2.setEnchantLevel(temp2.getEnchantLevel() + BressLv);
cha.sendPackets(cha.get_netConnection().bph().get_Item().ItemStatus(temp2), false);
break;
case 1: // 보통
if(temp2.getEnchantLevel() >= 0){ // 해당아이템 인첸레벨이 0 이상이라면
cha.sendPackets(cha.get_netConnection().bph().get_Message().S_ServerMessage(161, "+"+temp2.getEnchantLevel()+" "+temp2.getItem().get_name(), "파랗게", "한순간"), false);
}else{ // 해당아이템 인첸레벨이 0 이하라면
cha.sendPackets(cha.get_netConnection().bph().get_Message().S_ServerMessage(161, "-"+temp2.getEnchantLevel()+" "+temp2.getItem().get_name(), "파랗게", "한순간"), false);
}
temp2.setEnchantLevel(temp2.getEnchantLevel() + BressLv);
cha.sendPackets(cha.get_netConnection().bph().get_Item().ItemStatus(temp2), false);
break;
case 2: // 저주
if(temp2.getEnchantLevel() >= 0){ // 해당아이템 인첸레벨이 0 이상이라면
cha.sendPackets(cha.get_netConnection().bph().get_Message().S_ServerMessage(161, "+"+temp2.getEnchantLevel()+" "+temp2.getItem().get_name(), "붉게", "한순간"), false);
}else{ // 해당아이템 인첸레벨이 0 이하라면
cha.sendPackets(cha.get_netConnection().bph().get_Message().S_ServerMessage(161, "-"+temp2.getEnchantLevel()+" "+temp2.getItem().get_name(), "붉게", "한순간"), false);
}
temp2.setEnchantLevel(temp2.getEnchantLevel() - BressLv);
cha.sendPackets(cha.get_netConnection().bph().get_Item().ItemStatus(temp2), false);
BressLv = -1;
break;
}
if(temp2.isEquipped()){ // 해당 아이템 착용 중이라면
cha.set_Mr(cha.get_Mr() + (BressLv * temp2.getItem().get_enchantmr()) ); //추가
cha.set_ac(cha.get_ac() - BressLv);
cha.sendPackets(cha.get_netConnection().bph().S_Status(cha, 2), false);
cha.sendPackets(cha.get_netConnection().bph().S_Status(cha, 3), false); //추가
}
}else{ // 인첸 확율 적용 부분
if(temp.get_bress() < 2){ // 저주젤이 아니라면
int rnd = cha.getRnd().nextInt(100)+1;
//if(rnd<=((39-temp2.getEnchantLevel()))-(temp2.getEnchantLevel()/2)){ // 인첸 성공부분
if(rnd<=(GameServerSetting.getInstance().Rate_En)){ // 인첸 성공부분 게임서버 셋팅 적용
if(temp2.getEnchantLevel() >= 9) { //인챈레벨이 90이상 성공이라면 메세지출력
L1PcInstance[] players = L1World.getInstance().getAllPlayers();
for (int i = 0; i < players.length; i++){
players[i].sendPackets(players[i].get_netConnection().bph().get_cp().S_ChatPacket(players[i] , cha.get_name()+"님 +"+temp2.getEnchantLevel()+" "+temp2.getItem().get_name()+" 러쉬! 성공~~!!", Opcodes.S_OPCODE_GLOBALCHAT , 0x02), true);
}
}//여기까지....메세지출력
switch(temp.get_bress()){ // 축저주보통의 따라 인첸 하기
case 0: // 축
//[본섭화] 갑옷 마법 인첸트
if(temp2.getEnchantLevel() >= 0 && temp2.getEnchantLevel() <=5){// 갑옷 인첸트가 0 ~ 5 면
BressLv = cha.getRnd().nextInt(3)+1; // 1에서 3의 숫자 랜덤 선택
}else if(temp2.getEnchantLevel() == 6 ){ // 갑옷 인첸트가 6이면
BressLv = cha.getRnd().nextInt(2)+1; // 1에서 2의 숫자 랜덤 선택
}else if(temp2.getEnchantLevel() >= 7 ){ // 갑옷 인첸트가 7이상이면
BressLv =1;
}else{// 그외 갑옷 인첸트가 - 이면
BressLv = cha.getRnd().nextInt(3)+1; // 1에서 3의 숫자 랜덤 선택
}
//[본섭화] 갑옷 마법 인첸트
if(BressLv == 1){
cha.sendPackets(cha.get_netConnection().bph().get_Message().S_ServerMessage(161, "+"+temp2.getEnchantLevel()+" "+temp2.getItem().get_name(), "파랗게", "한순간"), false);
}else{
cha.sendPackets(cha.get_netConnection().bph().get_Message().S_ServerMessage(161, "+"+temp2.getEnchantLevel()+" "+temp2.getItem().get_name(), "파랗게", "잠시"), false);
}
temp2.setEnchantLevel(temp2.getEnchantLevel() + BressLv);
cha.sendPackets(cha.get_netConnection().bph().get_Item().ItemStatus(temp2), false);
break;
case 1: // 보통
cha.sendPackets(cha.get_netConnection().bph().get_Message().S_ServerMessage(161, "+"+temp2.getEnchantLevel()+" "+temp2.getItem().get_name(), "파랗게", "한순간"), false);
temp2.setEnchantLevel(temp2.getEnchantLevel() + BressLv);
cha.sendPackets(cha.get_netConnection().bph().get_Item().ItemStatus(temp2), false);
break;
}
if(temp2.isEquipped()){ // 해당 아이템 착용 중이라면
cha.set_Mr(cha.get_Mr() + (BressLv * temp2.getItem().get_enchantmr()) ); //추가
cha.set_ac(cha.get_ac() - BressLv);
cha.sendPackets(cha.get_netConnection().bph().S_Status(cha, 2), false);
cha.sendPackets(cha.get_netConnection().bph().S_Status(cha, 3), false); //추가
}
}else{ // 인첸 실패시
if(temp2.getEnchantLevel() >= 10) { //인챈레벨 10이상 실패시 메세지 출력
L1PcInstance[] players = L1World.getInstance().getAllPlayers();
for (int i = 0; i < players.length; i++){
players[i].sendPackets(players[i].get_netConnection().bph().get_cp().S_ChatPacket(players[i] , cha.get_name()+"님 +"+temp2.getEnchantLevel()+" "+temp2.getItem().get_name()+" 러쉬! 실패~~!!", Opcodes.S_OPCODE_GLOBALCHAT , 0x02), true);
}
}
if(temp2.isEquipped()){ // 해당 아이템 착용 중이라면
cha.set_Mr(cha.get_Mr()); // 착용후 러쉬실패시 마방 되돌리기
cha.set_ac(cha.get_ac() + (temp2.getItem().get_ac() + temp2.getEnchantLevel()));
cha.sendPackets(cha.get_netConnection().bph().S_Status(cha, 2), false);
ItemHandler.getInstance().op(cha, temp2, false);
switch(temp2.getItem().getType1()){
case 2:
cha.set_갑옷(false);
break;
case 10:
cha.set_망토(false);
if(cha.is_gmInvis()){ // 투망 상태중이라면
switch(cha.get_Setting()){ // 상태에따른 값 설정
case 6:
cha.set_Setting(4);
break;
case 22:
cha.set_Setting(20);
break;
}
cha.set_gmInvis(false);
cha.sendPackets(cha.get_netConnection().bph().S_Invisa(cha.get_objectId(), false), false);
for(int i=0 ; i<cha.getKnownPlayers().size() ; i++){
L1Object visible = (L1Object) cha.getKnownPlayers().get(i);
if(visible instanceof L1PcInstance){
L1PcInstance user = (L1PcInstance) visible;
user.sendPackets(user.get_netConnection().bph().S_Invisa(cha.get_objectId(), false), true);
}
}
}
break;
case 18:
cha.set_티셔츠(false);
break;
case 20:
cha.set_장갑(false);
break;
case 21:
cha.set_부츠(false);
break;
자 여기까지 하셨으면 착용후에 인첸트 올라가고 착용해제나 인첸 실패시 마방 수치가 잘 변화합니다.
마지막 옵션문제는 다음장으로~~~
이번엔 옵션 수정입니다. 최대 hp랑 mr 부분에서 바이트 수가 잘못 되있더라고요..
저만 그런게 아니고 거의 모든팩이이럴겁니다.
Item.java 입니다.
public byte[] S_InvList(L1PcInstance _cha){
public byte[] S_ItemAdd(L1PcInstance cha, L1ItemInstance item){
public byte[] ItemStatus(L1ItemInstance temp){
여기 세부분 다 고치세요.
if(temp[i].getItem().getAddhp() > 0){
TeMp = writeC(14);
TeMp = writeH(temp[i].getItem().getAddhp());
}
여기 보시면 빨강 부분 보이시죠? 저렇게 C를 H로 고쳐주세요~
if(temp[i].getItem().get_mr() > 0){
TeMp = writeC(15);
TeMp = writeH(temp[i].getItem().get_mr() + temp[i].getEnchantLevel() * temp[i].getItem().get_enchantmr());
}
여기도 확인해보시고 고치세요
shop.java랑 bph.java 도 똑같이 고치세요~~~
그다음중요한부분입니다.
public int 사이즈(int type, L1Item item){
이부분 보시면
case 1: // 무기 case 2: // 방어구 두군데 다를
if(sum > 0){
size += 2;
}
if(item.getAddhp() > 0){
size += 3;
}
if(item.get_mr() > 0){
size += 3;
}
위 부분과 똑같이 하세요~~ 너무 길어서 혹시나 제가 빠진게 잇나 모르겠네요. 확인해보시고 안된느거 말씀해보세요~
이제 모든게 끝입니다.

김닉넴 님의 최근 댓글
클라는 있나요? 2023 04.29 클라 있나요? 2023 03.23 감사합니다 2016 06.06 ㄳ합니다 2016 06.05 ㄳ합니다 2016 06.05