Beispiel #1
0
  private void deleteItem() {
    int numOfDeleted = 0;
    for (L1Object obj : L1World.getInstance().getObject()) {
      if (!(obj instanceof L1ItemInstance)) {
        continue;
      }

      L1ItemInstance item = (L1ItemInstance) obj;
      if (item.getX() == 0 && item.getY() == 0) { // 地面上のアイテムではなく、誰かの所有物
        continue;
      }
      if (item.getItem().getItemId() == 40515) { // 精霊の石
        continue;
      }
      if (L1HouseLocation.isInHouse(item.getX(), item.getY(), item.getMapId())) { // アジト内
        continue;
      }

      List<L1PcInstance> players =
          L1World.getInstance().getVisiblePlayer(item, Config.ALT_ITEM_DELETION_RANGE);
      if (players.isEmpty()) { // 指定範囲内にプレイヤーが居なければ削除
        L1Inventory groundInventory =
            L1World.getInstance().getInventory(item.getX(), item.getY(), item.getMapId());
        groundInventory.removeItem(item);
        numOfDeleted++;
      }
    }
    _log.fine("ワールドマップ上のアイテムを自動削除。削除数: " + numOfDeleted);
  }
  public ItemInfo getBuyItemInfo(L1ItemInstance item) {
    for (ItemInfo itemInfo : _idlist.values()) {
      if (itemInfo.id == item.getItemId()
          && itemInfo.bless == item.getBless()
          && itemInfo.enchantlvl == item.getEnchantLevel()) {
        return itemInfo;
      }
    }

    return null;
  }
Beispiel #3
0
 // 비누
 private void Soap(
     L1PcInstance pc, L1ItemInstance useItem, L1ItemInstance targetItem, int itemid) {
   if (targetItem.isEquipped()) {
     pc.sendPackets(new S_ServerMessage(1317));
     return;
   }
   createNewItemR(pc, itemid, 1, targetItem.getEnchantLevel());
   pc.getInventory().removeItem(useItem, 1);
   pc.getInventory().removeItem(targetItem, 1);
   pc.saveInventory();
 }
  private static void storeItem(L1PcInstance pc, L1ItemInstance item) {
    L1Inventory inventory;

    if (pc.getInventory().checkAddItem(item, item.getCount()) == L1Inventory.OK) {
      inventory = pc.getInventory();
    } else {
      // 持てない場合は地面に落とす 処理のキャンセルはしない(不正防止)
      inventory = L1World.getInstance().getInventory(pc.getLocation());
    }
    inventory.storeItem(item);
    pc.sendPackets(new S_ServerMessage(403, item.getLogName())); // %0を手に入れました。
  }
  /**
   * TreasureBoxを開けるPCにアイテムを入手させる。PCがアイテムを持ちきれなかった場合は アイテムは地面に落ちる。
   *
   * @param pc - TreasureBoxを開けるPC
   * @return 開封した結果何らかのアイテムが出てきた場合はtrueを返す。 持ちきれず地面に落ちた場合もtrueになる。
   */
  public boolean open(L1PcInstance pc) {
    L1ItemInstance item = null;

    if (getType().equals(TYPE.SPECIFIC)) {
      // 出るアイテムが決まっているもの
      for (Item each : getItems()) {
        item = ItemTable.getInstance().createItem(each.getItemId());
        if (item != null) {
          item.setCount(each.getCount());
          storeItem(pc, item);
        }
      }

    } else if (getType().equals(TYPE.RANDOM)) {
      // 出るアイテムがランダムに決まるもの
      RandomGenerator random = RandomGeneratorFactory.getSharedRandom();
      int chance = 0;

      int r = random.nextInt(getTotalChance());

      for (Item each : getItems()) {
        chance += each.getChance();

        if (r < chance) {
          item = ItemTable.getInstance().createItem(each.getItemId());
          if (item != null) {
            item.setCount(each.getCount());
            storeItem(pc, item);
          }
          break;
        }
      }
    }

    if (item == null) {
      return false;
    } else {
      int itemId = getBoxId();

      // 魂の結晶の破片、魔族のスクロール、ブラックエントの実
      if (itemId == 40576
          || itemId == 40577
          || itemId == 40578
          || itemId == 40411
          || itemId == 49013) {
        pc.death(null); // キャラクターを死亡させる
      }
      return true;
    }
  }
Beispiel #6
0
 // 변환석
 private void Transform(
     L1PcInstance pc, L1ItemInstance useItem, L1ItemInstance targetItem, int enchant_check) {
   int itemid = targetItem.getItem().getItemId();
   if (itemid >= 21028 && itemid <= 21033 || itemid >= 490000 && itemid <= 490017) { // 기존 스탯티
     if (targetItem.getEnchantLevel() == enchant_check) {
       createNewItemR(pc, 20085, 1, targetItem.getEnchantLevel() + 1);
       pc.getInventory().removeItem(useItem, 1);
       pc.getInventory().removeItem(targetItem, 1);
     } else {
       pc.sendPackets(new S_ServerMessage(328));
     }
   } else {
     pc.sendPackets(new S_ServerMessage(328));
   }
 }
Beispiel #7
0
 // 일반티 생성
 private boolean createNewItemR(L1PcInstance pc, int item_id, int count, int enchant) {
   L1ItemInstance item = ItemTable.getInstance().createItem(item_id);
   item.setCount(count);
   item.setIdentified(true);
   item.setEnchantLevel(enchant);
   if (item != null) {
     if (pc.getInventory().checkAddItem(item, count) == L1Inventory.OK) {
       pc.getInventory().storeItem(item);
       pc.sendPackets(new S_ServerMessage(403, item.getLogName()));
     } else {
       L1World.getInstance().getInventory(pc.getX(), pc.getY(), pc.getMapId()).storeItem(item);
     }
     return true;
   } else {
     return false;
   }
 }
Beispiel #8
0
 // 문양
 private void PatternIn(
     L1PcInstance pc, L1ItemInstance useItem, L1ItemInstance targetItem, int pandoraset) {
   int targetItemId = targetItem.getItem().getItemId();
   if (targetItem.getPandoraT() == pandoraset) {
     pc.sendPackets(new S_SystemMessage("이미 같은 문양이 부여되어 있습니다."));
     return;
   }
   if (targetItem.isEquipped()) {
     pc.sendPackets(new S_ServerMessage(1317));
     return;
   }
   if (targetItemId >= 22440 && targetItemId <= 22445
       || targetItemId >= 22405 && targetItemId <= 22455) { // 판도라 티셔츠
     targetItem.setPandoraT(pandoraset);
     pc.getInventory().updateItem(targetItem, L1PcInventory.COL_PANDORA);
     pc.getInventory().saveItem(targetItem, L1PcInventory.COL_PANDORA);
     pc.getInventory().removeItem(useItem, 1);
     pc.saveInventory();
   } else {
     pc.sendPackets(new S_ServerMessage(328));
   }
 }
Beispiel #9
0
 // 檢查身上的鑰匙
 private int checkInnKey(L1PcInstance pc, int npcid) {
   for (L1ItemInstance item : pc.getInventory().getItems()) {
     if (item.getInnNpcId() == npcid) { // 鑰匙與旅館NPC相符
       for (int i = 0; i < 16; i++) {
         L1Inn inn = InnTable.getInstance().getTemplate(npcid, i);
         if (inn.getKeyId() == item.getKeyId()) {
           Timestamp dueTime = item.getDueTime();
           if (dueTime != null) { // 時間不為空值
             Calendar cal = Calendar.getInstance();
             if (((cal.getTimeInMillis() - dueTime.getTime()) / 1000) < 0) { // 租用時間未到
               pc.setInnKeyId(item.getKeyId()); // 登入此鑰匙
               return item.checkRoomOrHall() ? 2 : 1; // 1:房間 2:會議室
             }
           }
         }
       }
     }
   }
   return 0;
 }
  private void buildPacket(L1PcInstance pc) {
    writeC(Opcodes.S_OPCODE_SELECTLIST);
    writeD(0x000000c8); // Price

    List<L1ItemInstance> weaponList = new FastTable<L1ItemInstance>();
    List<L1ItemInstance> itemList = pc.getInventory().getItems();
    for (L1ItemInstance item : itemList) {

      // Find Weapon
      if (item.getItem().getType2() == 1) {
        if (item.get_durability() > 0) {
          weaponList.add(item);
        }
      }
    }

    writeH(weaponList.size()); // Weapon Amount

    for (L1ItemInstance weapon : weaponList) {

      writeD(weapon.getId()); // Item ID
      writeC(weapon.get_durability()); // Fix Level
    }
  }
  public C_DeleteInventoryItem(byte[] decrypt, LineageClient client) {
    super(decrypt);
    if (client == null) {
      return;
    }
    int itemObjectId = readD();
    int count = readD(); // 추가
    L1PcInstance pc = client.getActiveChar();
    L1ItemInstance item = pc.getInventory().getItem(itemObjectId);

    // 삭제하려고 한 아이템이 서버상에 없는 경우
    if (item == null) {
      return;
    }
    if (item.getItem().isCantDelete()) {
      pc.sendPackets(new S_ServerMessage(125));
      return;
    }
    if (item.isEquipped()) {
      // \f1삭제할 수 없는 아이템이나 장비 하고 있는 아이템은 버릴 수 없습니다.
      pc.sendPackets(new S_ServerMessage(125));
      return;
    }
    if (!pc.isGm()
        && (item.getItemId() >= 0
            && (item.getItemId() == 46115 // 마빈
                || item.getItemId() == 46116 // 구슬조각
                || item.getItemId() == 46118 // 구슬조각
                || item.getItemId() == 4500011 // 서버정보
                || item.getItemId() == 41159 // 서버정보
                || item.getItemId() == 46193))) { // 생존외침
      pc.sendPackets(new S_ServerMessage(210, item.getItem().getName()));
      return;
    }
    // if (item.getBless() >= 128) {//봉인템삭제가능
    // pc.sendPackets(new S_ServerMessage(210, item.getItem().getName())); // \f1%0은
    // 버리거나
    // 또는
    // 타인에게
    // 양일을
    // 할 수
    // 없습니다.
    // return;
    // }

    Object[] petlist = pc.getPetList().values().toArray();
    L1PetInstance pet = null;
    for (Object petObject : petlist) {
      if (petObject instanceof L1PetInstance) {
        pet = (L1PetInstance) petObject;
        if (item.getId() == pet.getItemObjId()) {
          // \f1%0은 버리거나 또는 타인에게 양일을 할 수 없습니다.
          pc.sendPackets(new S_ServerMessage(210, item.getItem().getName()));
          return;
        }
      }
    }
    CodeLogger.getInstance().oblog("인벤삭제", pc.getName(), item, item.getCount());
    // eva.LogObserverAppend("템삭제","<"+pc.getName()+">"+item.getName()
    // +"(+"+item.getEnchantLevel()+")"+"[갯수]"+" ("+item.getCount()+")"); // 추가
    eva.LogObserverAppend("템삭제", pc.getName(), item, item.getCount(), itemObjectId);
    if (count == 0) count = item.getCount();
    pc.getInventory().removeItem(item, count);
    pc.getLight().turnOnOffLight();
  }
Beispiel #12
0
 // 스탯티로 변환
 private void PandoraTransform(
     L1PcInstance pc, L1ItemInstance useItem, L1ItemInstance targetItem, int itemid, int EndTime) {
   createNewItemR(pc, itemid, 1, targetItem.getEnchantLevel(), EndTime);
   pc.getInventory().removeItem(useItem, 1);
   pc.getInventory().removeItem(targetItem, 1);
 }
Beispiel #13
0
 @Override
 public void clickItem(L1Character cha, ClientBasePacket packet) {
   try {
     if (cha instanceof L1PcInstance) {
       L1PcInstance pc = (L1PcInstance) cha;
       L1ItemInstance useItem = pc.getInventory().getItem(this.getId());
       L1ItemInstance targetItem = pc.getInventory().getItem(packet.readD());
       int targetItemId = targetItem.getItemId();
       int itemId = this.getItemId();
       int EndTime = 360000 * 1000; // 5일
       switch (itemId) {
           /**
            * 스탯티 변환
            *
            * <p>*
            */
         case 89531: // 판도라의 완력꽃 향수:티[30일]
           switch (targetItemId) {
             case 20085: // 티셔츠
               PandoraTransform(pc, useItem, targetItem, 22440, EndTime); // 판도라의 완력꽃향 티
               break;
             case 20084: // 요정족 티셔츠
               PandoraTransform(pc, useItem, targetItem, 22450, EndTime); // 판도라의 완력꽃향 요정족 티
               break;
             default:
               pc.sendPackets(new S_ServerMessage(328));
           }
           break;
         case 89532: // 판도라의 민첩꽃 향수:티[30일]
           switch (targetItemId) {
             case 20085: // 티셔츠
               PandoraTransform(pc, useItem, targetItem, 22441, EndTime); // 판도라의 민첩꽃향 티
               break;
             case 20084: // 요정족 티셔츠
               PandoraTransform(pc, useItem, targetItem, 22451, EndTime); // 판도라의 민첩꽃향 요정족 티
               break;
             default:
               pc.sendPackets(new S_ServerMessage(328));
           }
           break;
         case 89533: // 판도라의 지식꽃 향수:티[30일]
           switch (targetItemId) {
             case 20085: // 티셔츠
               PandoraTransform(pc, useItem, targetItem, 22442, EndTime); // 판도라의 지식꽃향 티
               break;
             case 20084: // 요정족 티셔츠
               PandoraTransform(pc, useItem, targetItem, 22452, EndTime); // 판도라의 지식꽃향 요정족 티
               break;
             default:
               pc.sendPackets(new S_ServerMessage(328));
           }
           break;
         case 89534: // 판도라의 지혜꽃 향수:티[30일]
           switch (targetItemId) {
             case 20085: // 티셔츠
               PandoraTransform(pc, useItem, targetItem, 22443, EndTime); // 판도라의 지혜꽃향 티
               break;
             case 20084: // 요정족 티셔츠
               PandoraTransform(pc, useItem, targetItem, 22453, EndTime); // 판도라의 지혜꽃향 요정족 티
               break;
             default:
               pc.sendPackets(new S_ServerMessage(328));
           }
           break;
         case 89535: // 판도라의 체력꽃 향수:티[30일]
           switch (targetItemId) {
             case 20085: // 티셔츠
               PandoraTransform(pc, useItem, targetItem, 22444, EndTime); // 판도라의 체력꽃향 티
               break;
             case 20084: // 요정족 티셔츠
               PandoraTransform(pc, useItem, targetItem, 22454, EndTime); // 판도라의 체력꽃향 요정족 티
               break;
             default:
               pc.sendPackets(new S_ServerMessage(328));
           }
           break;
         case 89536: // 판도라의 매력꽃 향수:티[30일]
           switch (targetItemId) {
             case 20085: // 티셔츠
               PandoraTransform(pc, useItem, targetItem, 22445, EndTime); // 판도라의 매력꽃향 티
               break;
             case 20084: // 요정족 티셔츠
               PandoraTransform(pc, useItem, targetItem, 22455, EndTime); // 판도라의 매력꽃향 요정족 티
               break;
             default:
               pc.sendPackets(new S_ServerMessage(328));
           }
           break;
           /**
            * 천연 비누
            *
            * <p>*
            */
         case 89530: // 천연 비누:판도라 향기티
           switch (targetItemId) {
               // 일반 티셔츠
             case 22440:
             case 22441:
             case 22442:
             case 22443:
             case 22444:
             case 22445:
               Soap(pc, useItem, targetItem, 20085);
               break;
               // 요정족 티셔츠
             case 22450:
             case 22451:
             case 22452:
             case 22453:
             case 22454:
             case 22455:
               Soap(pc, useItem, targetItem, 20084);
               break;
             default:
               pc.sendPackets(new S_ServerMessage(328));
           }
           break;
           /**
            * 판도라의 문양:티
            *
            * <p>*
            */
         case 89550: // 판도라의 스턴 문양:티
           PatternIn(pc, useItem, targetItem, 1);
           break;
         case 89551: // 판도라의 홀드 문양:티
           PatternIn(pc, useItem, targetItem, 2);
           break;
         case 89552: // 판도라의 회복 문양:티
           PatternIn(pc, useItem, targetItem, 3);
           break;
         case 89553: // 판도라의 강철 문양:티
           PatternIn(pc, useItem, targetItem, 4);
           break;
         case 89554: // 판도라의 멸마 문양:티
           PatternIn(pc, useItem, targetItem, 5);
           break;
         case 89555: // 판도라의 체력 문양:티
           PatternIn(pc, useItem, targetItem, 6);
           break;
         case 89556: // 판도라의 마나 문양:티
           PatternIn(pc, useItem, targetItem, 7);
           break;
         case 89557: // 판도라의 정령 문양:티
           PatternIn(pc, useItem, targetItem, 8);
           break;
         case 89558: // 판도라의 석화 문양:티
           PatternIn(pc, useItem, targetItem, 9);
           break;
           /**
            * 변환석 : 스탯티에서 +1 상승하여 일반 티셔츠로 변환.
            *
            * <p>*
            */
         case 46030: // 변환석: +0 티
           Transform(pc, useItem, targetItem, 0);
           break;
         case 46031: // 변환석: +1 티
           Transform(pc, useItem, targetItem, 1);
           break;
         case 46032: // 변환석: +2 티
           Transform(pc, useItem, targetItem, 2);
           break;
         case 46033: // 변환석: +3 티
           Transform(pc, useItem, targetItem, 3);
           break;
         case 46034: // 변환석: +4 티
           Transform(pc, useItem, targetItem, 4);
           break;
         case 46035: // 변환석: +5 티
           Transform(pc, useItem, targetItem, 5);
           break;
         case 46036: // 변환석: +6 티
           Transform(pc, useItem, targetItem, 6);
           break;
         case 46037: // 변환석: +7 티
           Transform(pc, useItem, targetItem, 7);
           break;
         case 46038: // 변환석: +8 티
           Transform(pc, useItem, targetItem, 8);
           break;
         case 46039: // 변환석: +9 티
           Transform(pc, useItem, targetItem, 9);
           break;
         case 46040: // 변환석: +10 티
           Transform(pc, useItem, targetItem, 10);
           break;
         case 46041: // 변환석: +11 티
           Transform(pc, useItem, targetItem, 11);
           break;
       }
     }
   } catch (Exception e) {
     e.printStackTrace();
   }
 }