2.7 // 제작식에 enchant 넣는 법.
컨텐츠 정보
- 282 조회
- 6 댓글
- 0 추천
- 0 비추천
-
목록
본문
안녕하세요,
제작 식에 enchant를 넣고 싶은데, 아래가 2.7 제작식 기본구조입니다.
<Action Name="request fauchard">
<MakeItem>
<Item Amount="1" ItemId="104"/>
<Material Amount="1" ItemId="99"/>
만약 +9의 ItemID 99로 설정하고 싶어서 아래처럼 했는데 안되더라구요..
<Action Name="request fauchard">
<MakeItem>
<Item Amount="1" ItemId="104"/>
<Material Amount="1" ItemId="99" Enchant="9"/>
의견 좀 주시면 감사드리겠습니다!
-
등록일 2025.01.07
-
등록일 2024.12.25
-
등록일 2024.11.032.7 // attr이 뭔가요.댓글 2
-
등록일 2024.10.212.7 // NPC 겹침 설정.댓글 2
관련자료
댓글 6

지누아빠님의 댓글
지금 소스 수정해보고 만들어지는것 강화수치 확인하고 다시 답글 답니다
1. xml 파일 소스 수정 및 테스트
<Action Name="request iron gloves">
<MakeItem>
<Item Amount="1" ItemId="20163" enchant="4" />
<Material Amount="1" ItemId="20182"/>
<Material Amount="150" ItemId="40408"/>
<Material Amount="25000" ItemId="40308"/>
</MakeItem>
</Action>
헥터NPC 의 강철장갑 만드는 xml 파일에서 enchant="4" <-- 추가했습니다
1. L1NpcMakeItemAction
일단 해당xml 파일에서 읽어들이는 액션이 2.7은 어떤파일명인지 모르겠으나 파일 찾으셔서 추가 구문을 넣으셔야합니다.
_isAmountInputable = L1NpcXmlParser.getBoolAttribute(element,"AmountInputable", true);
NodeList list = element.getChildNodes();
for (Element elem : new IterableElementList(list)) {
if (elem.getNodeName().equalsIgnoreCase("Material")) {
int id = Integer.valueOf(elem.getAttribute("ItemId"));
int amount = Integer.valueOf(elem.getAttribute("Amount"));
_materials.add(new L1ObjectAmount<Integer>(id, amount,0)); <-- 이곳에 재료 인첸트 3번째 인수추가했음
continue;
}
if (elem.getNodeName().equalsIgnoreCase("Item")) {
int id = Integer.valueOf(elem.getAttribute("ItemId"));
int amount = Integer.valueOf(elem.getAttribute("Amount"));
int enchant = L1NpcXmlParser.getIntAttribute(elem, "enchant", 0); <-- xml 파일에서 읽어올 인첸트 변수 추가
_items.add(new L1ObjectAmount<Integer>(id, amount, enchant)); <- 제작완료시 생성아이템 인첸트인수 추가
continue;
}
}
해당 구문을 찾으셔서 보시면 제것에는 enchant 를 넣는것이 추가되었습니다. 아이템에만 실제 파일에서 읽어들여서 없으면 0처리됩니다. L1ObjectAmount<-- 이클립스에서 컨트롤+좌클릭 으로 (3번에서 해야할것)바로찾아가집니다
2. 해당파일 하단 makeItems 메서드확인
아이템 생성 구문이 있습니다.
L1ItemInstance item = pc.getInventory().storeItem2(makingItem.getObject(), makingItem.getAmount() * amount, makingItem.getEnchant());
제꺼랑 비교해 보시면 storeItem2 <-- 원래 그냥꺼인데 제가 2버전을 만든겁니다. 그리고 3번째인수인 enchant를 포함했습니다
3. 변수가 정의된 L1ObjectAmount
public class L1ObjectAmount<T> {
private final T _obj;
private final int _amount;
private final int _enchant;
public L1ObjectAmount(T obj, int amount, int enchant) {
_obj = obj;
_amount = amount;
_enchant = enchant;
}
public T getObject() {
return _obj;
}
public int getAmount() {
return _amount;
}
public int getEnchant() {
return _enchant;
}
}
인챈트관련 추가하셔야합니다
마지막...은
1. xml 파일 소스 수정 및 테스트
<Action Name="request iron gloves">
<MakeItem>
<Item Amount="1" ItemId="20163" enchant="4" />
<Material Amount="1" ItemId="20182"/>
<Material Amount="150" ItemId="40408"/>
<Material Amount="25000" ItemId="40308"/>
</MakeItem>
</Action>
헥터NPC 의 강철장갑 만드는 xml 파일에서 enchant="4" <-- 추가했습니다
1. L1NpcMakeItemAction
일단 해당xml 파일에서 읽어들이는 액션이 2.7은 어떤파일명인지 모르겠으나 파일 찾으셔서 추가 구문을 넣으셔야합니다.
_isAmountInputable = L1NpcXmlParser.getBoolAttribute(element,"AmountInputable", true);
NodeList list = element.getChildNodes();
for (Element elem : new IterableElementList(list)) {
if (elem.getNodeName().equalsIgnoreCase("Material")) {
int id = Integer.valueOf(elem.getAttribute("ItemId"));
int amount = Integer.valueOf(elem.getAttribute("Amount"));
_materials.add(new L1ObjectAmount<Integer>(id, amount,0)); <-- 이곳에 재료 인첸트 3번째 인수추가했음
continue;
}
if (elem.getNodeName().equalsIgnoreCase("Item")) {
int id = Integer.valueOf(elem.getAttribute("ItemId"));
int amount = Integer.valueOf(elem.getAttribute("Amount"));
int enchant = L1NpcXmlParser.getIntAttribute(elem, "enchant", 0); <-- xml 파일에서 읽어올 인첸트 변수 추가
_items.add(new L1ObjectAmount<Integer>(id, amount, enchant)); <- 제작완료시 생성아이템 인첸트인수 추가
continue;
}
}
해당 구문을 찾으셔서 보시면 제것에는 enchant 를 넣는것이 추가되었습니다. 아이템에만 실제 파일에서 읽어들여서 없으면 0처리됩니다. L1ObjectAmount<-- 이클립스에서 컨트롤+좌클릭 으로 (3번에서 해야할것)바로찾아가집니다
2. 해당파일 하단 makeItems 메서드확인
아이템 생성 구문이 있습니다.
L1ItemInstance item = pc.getInventory().storeItem2(makingItem.getObject(), makingItem.getAmount() * amount, makingItem.getEnchant());
제꺼랑 비교해 보시면 storeItem2 <-- 원래 그냥꺼인데 제가 2버전을 만든겁니다. 그리고 3번째인수인 enchant를 포함했습니다
3. 변수가 정의된 L1ObjectAmount
public class L1ObjectAmount<T> {
private final T _obj;
private final int _amount;
private final int _enchant;
public L1ObjectAmount(T obj, int amount, int enchant) {
_obj = obj;
_amount = amount;
_enchant = enchant;
}
public T getObject() {
return _obj;
}
public int getAmount() {
return _amount;
}
public int getEnchant() {
return _enchant;
}
}
인챈트관련 추가하셔야합니다
마지막...은

지누아빠님의 댓글
l1j.server.server.model.L1Inventory.java
기존존재하는 storeItem 메서드를 복사하여 storeItem2 를 만들고 enchant 를 받습니다
그리고 아래 스텍없는 경우의 아이템에서
item.setEnchantLevel(enchant); <-- 인챈트를 포함하는 구문을 넣어야합니다.
// 새로운 아이템의 격납, 3번째 인수인 enchant 추가로 받음
public L1ItemInstance storeItem2(int id, int count, int enchant) {
L1Item temp = ItemTable.getInstance().getTemplate(id);
if (temp == null) {
return null;
}
if (temp.isStackable()) {
L1ItemInstance item = new L1ItemInstance(temp, count);
if (findItemId(id) == null) { // 새롭게 생성할 필요가 있는 경우만 ID의 발행과 L1World에의 등록을 실시한다
item.setId(IdFactory.getInstance().nextId());
item.setCount(count);
item.setBless(temp.getBless());
item.setAttrEnchantLevel(0);
if (!temp.isStackable() || findItemId(id) == null) {// 새롭게 생성할 필요가 있는 경우만 ID의 발행과 L1World에의 등록을 실시한다
item.setId(IdFactory.getInstance().nextId());
L1World.getInstance().storeObject(item);
}
}
return storeItem(item);
}
// 스택 할 수 없는 아이템의 경우
L1ItemInstance result = null;
for (int i = 0; i < count; i++) {
L1ItemInstance item = new L1ItemInstance(temp, 1);
item.setId(IdFactory.getInstance().nextId());
item.setBless(temp.getBless());
item.setEnchantLevel(enchant); <-- 여기 추가부분
item.setAttrEnchantLevel(0);
L1World.getInstance().storeObject(item);
storeItem(item);
result = item;
}
// 마지막에 만든 아이템을 돌려준다. 배열을 되돌리도록(듯이) 메소드 정의를 변경하는 편이 좋을지도 모른다.
return result;
}
성공 기원합니다.
기존존재하는 storeItem 메서드를 복사하여 storeItem2 를 만들고 enchant 를 받습니다
그리고 아래 스텍없는 경우의 아이템에서
item.setEnchantLevel(enchant); <-- 인챈트를 포함하는 구문을 넣어야합니다.
// 새로운 아이템의 격납, 3번째 인수인 enchant 추가로 받음
public L1ItemInstance storeItem2(int id, int count, int enchant) {
L1Item temp = ItemTable.getInstance().getTemplate(id);
if (temp == null) {
return null;
}
if (temp.isStackable()) {
L1ItemInstance item = new L1ItemInstance(temp, count);
if (findItemId(id) == null) { // 새롭게 생성할 필요가 있는 경우만 ID의 발행과 L1World에의 등록을 실시한다
item.setId(IdFactory.getInstance().nextId());
item.setCount(count);
item.setBless(temp.getBless());
item.setAttrEnchantLevel(0);
if (!temp.isStackable() || findItemId(id) == null) {// 새롭게 생성할 필요가 있는 경우만 ID의 발행과 L1World에의 등록을 실시한다
item.setId(IdFactory.getInstance().nextId());
L1World.getInstance().storeObject(item);
}
}
return storeItem(item);
}
// 스택 할 수 없는 아이템의 경우
L1ItemInstance result = null;
for (int i = 0; i < count; i++) {
L1ItemInstance item = new L1ItemInstance(temp, 1);
item.setId(IdFactory.getInstance().nextId());
item.setBless(temp.getBless());
item.setEnchantLevel(enchant); <-- 여기 추가부분
item.setAttrEnchantLevel(0);
L1World.getInstance().storeObject(item);
storeItem(item);
result = item;
}
// 마지막에 만든 아이템을 돌려준다. 배열을 되돌리도록(듯이) 메소드 정의를 변경하는 편이 좋을지도 모른다.
return result;
}
성공 기원합니다.