Форум администраторов игровых серверов

Форум администраторов игровых серверов (https://forum.zone-game.info/TT.php)
-   Работа с геодатой (https://forum.zone-game.info/forumdisplay.php?f=38)
-   -   Проходимость дверей. (https://forum.zone-game.info/showthread.php?t=32522)

the2fantasy 17.11.2013 21:02

Проходимость дверей.
 
Добрый день,
есть двери внутри SoD

door.xml:
Свернуть ↑Развернуть ↓


во время инста tiat их можно просто проходить стрелочками.

Вопрос: как сделать двери непроходимыми?

qweqwe1 17.11.2013 21:13

Re: Проходимость дверей.
 
Где-то должен быть метод checkIfDoorsBetween, проверить его работоспособность и использование
Проверить координаты дверей
Проверить состояния дверей в нужный момент времени
p.s. еще отдельно проверить перемещение стрелочками

the2fantasy 17.11.2013 21:21

Re: Проходимость дверей.
 
сборка на основе l2p
методом поиска не нашел ничего подобного.
вот файлик из ядра.

Код:

package l2p.gameserver.modules.data;

import l2p.Config;
import l2p.gameserver.idfactory.IdFactory;
import l2p.gameserver.model.L2Territory;
import l2p.gameserver.model.instances.L2DoorInstance;
import l2p.gameserver.templates.L2CharTemplate;
import l2p.gameserver.templates.StatsSet;
import org.w3c.dom.Document;
import org.w3c.dom.NamedNodeMap;
import org.w3c.dom.Node;

import javax.xml.parsers.DocumentBuilderFactory;
import java.io.File;
import java.util.HashMap;
import java.util.logging.Logger;

public class DoorTable
{
        private static final Logger _log = Logger.getLogger(DoorTable.class.getName());
        private HashMap<Integer, L2DoorInstance> _staticItems;
        private static DoorTable _instance;

        public static DoorTable getInstance()
        {
                if(_instance == null)
                {
                        new DoorTable();
                }
                return _instance;
        }

        public DoorTable()
        {
                _instance = this;
                _staticItems = new HashMap<Integer, L2DoorInstance>();
                readDoors();
        }

        public void respawn()
        {
                for(L2DoorInstance door : _staticItems.values())
                {
                        if(door != null)
                        {
                                door.decayMe();
                        }
                }
                _instance = new DoorTable();
        }

        private void readDoors()
        {
                DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
                Document doc;
                try
                {
                        File f = new File(Config.DATAPACK_ROOT + "/data/xml/doors.xml");
                        doc = factory.newDocumentBuilder().parse(f);
                        for(Node n = doc.getFirstChild(); n != null; n = n.getNextSibling())
                        {
                                if(n.getNodeName().equalsIgnoreCase("doors"))
                                {
                                        for(Node n1 = n.getFirstChild(); n1 != null; n1 = n1.getNextSibling())
                                        {
                                                if(n1.getNodeName().equalsIgnoreCase("door"))
                                                {
                                                        NamedNodeMap attr = n1.getAttributes();
                                                        //--------------------------------------------------------------
                                                        int id = Integer.parseInt(attr.getNamedItem("id").getNodeValue());
                                                        String name = attr.getNamedItem("name").getNodeValue();
                                                        int hp = Integer.parseInt(attr.getNamedItem("hp").getNodeValue());
                                                        int pdef = Integer.parseInt(attr.getNamedItem("pdef").getNodeValue());
                                                        int mdef = Integer.parseInt(attr.getNamedItem("mdef").getNodeValue());
                                                        boolean unlockable = Boolean.parseBoolean(attr.getNamedItem("unlockable").getNodeValue());
                                                        int key = Integer.parseInt(attr.getNamedItem("key").getNodeValue());
                                                        byte level = Byte.parseByte(attr.getNamedItem("level").getNodeValue());
                                                        boolean showHp = Boolean.parseBoolean(attr.getNamedItem("showHp").getNodeValue());
                                                        int posx = Integer.parseInt(attr.getNamedItem("posx").getNodeValue());
                                                        int posy = Integer.parseInt(attr.getNamedItem("posy").getNodeValue());
                                                        int posz = Integer.parseInt(attr.getNamedItem("posz").getNodeValue());
                                                        int ax = Integer.parseInt(attr.getNamedItem("ax").getNodeValue());
                                                        int ay = Integer.parseInt(attr.getNamedItem("ay").getNodeValue());
                                                        int bx = Integer.parseInt(attr.getNamedItem("bx").getNodeValue());
                                                        int by = Integer.parseInt(attr.getNamedItem("by").getNodeValue());
                                                        int cx = Integer.parseInt(attr.getNamedItem("cx").getNodeValue());
                                                        int cy = Integer.parseInt(attr.getNamedItem("cy").getNodeValue());
                                                        int dx = Integer.parseInt(attr.getNamedItem("dx").getNodeValue());
                                                        int dy = Integer.parseInt(attr.getNamedItem("dy").getNodeValue());
                                                        int minz = Integer.parseInt(attr.getNamedItem("minz").getNodeValue());
                                                        int maxz = Integer.parseInt(attr.getNamedItem("maxz").getNodeValue());
                                                        boolean siege_weapon = Boolean.parseBoolean(attr.getNamedItem("siege_weapon").getNodeValue());
                                                        boolean geodata = Boolean.parseBoolean(attr.getNamedItem("geodata").getNodeValue());
                                                        //--------------------------------------------------------------
                                                        StatsSet baseDat = new StatsSet();
                                                        baseDat.set("level", 0);
                                                        baseDat.set("jClass", "door");
                                                        baseDat.set("baseSTR", 0);
                                                        baseDat.set("baseCON", 0);
                                                        baseDat.set("baseDEX", 0);
                                                        baseDat.set("baseINT", 0);
                                                        baseDat.set("baseWIT", 0);
                                                        baseDat.set("baseMEN", 0);
                                                        baseDat.set("baseShldDef", 0);
                                                        baseDat.set("baseShldRate", 0);
                                                        baseDat.set("baseAccCombat", 38);
                                                        baseDat.set("baseEvasRate", 38);
                                                        baseDat.set("baseCritRate", 38);
                                                        baseDat.set("collision_radius", 5);
                                                        baseDat.set("collision_height", 0);
                                                        baseDat.set("sex", "male");
                                                        baseDat.set("type", "");
                                                        baseDat.set("baseAtkRange", 0);
                                                        baseDat.set("baseMpMax", 0);
                                                        baseDat.set("baseCpMax", 0);
                                                        baseDat.set("revardExp", 0);
                                                        baseDat.set("revardSp", 0);
                                                        baseDat.set("basePAtk", 0);
                                                        baseDat.set("baseMAtk", 0);
                                                        baseDat.set("basePAtkSpd", 0);
                                                        baseDat.set("aggroRange", 0);
                                                        baseDat.set("baseMAtkSpd", 0);
                                                        baseDat.set("rhand", 0);
                                                        baseDat.set("lhand", 0);
                                                        baseDat.set("armor", 0);
                                                        baseDat.set("baseWalkSpd", 0);
                                                        baseDat.set("baseRunSpd", 0);
                                                        baseDat.set("baseHpReg", 0);
                                                        baseDat.set("baseCpReg", 0);
                                                        baseDat.set("baseMpReg", 0);
                                                        baseDat.set("siege_weapon", false);
                                                        baseDat.set("geodata", true);
                                                        //--------------------------------------------------------------
                                                        StatsSet npcDat;
                                                        npcDat = baseDat.clone();
                                                        npcDat.set("npcId", id);
                                                        npcDat.set("name", name);
                                                        npcDat.set("baseHpMax", hp);
                                                        npcDat.set("basePDef", pdef);
                                                        npcDat.set("baseMDef", mdef);
                                                        L2CharTemplate template = new L2CharTemplate(npcDat);
                                                        L2DoorInstance door = new L2DoorInstance(IdFactory.getInstance().getNextId(), template, id, name, unlockable, showHp);
                                                        _staticItems.put(id, door);
                                                        L2Territory pos = new L2Territory(id);
                                                        door.setGeoPos(pos);
                                                        pos.add(ax, ay, minz, maxz);
                                                        pos.add(bx, by, minz, maxz);
                                                        pos.add(cx, cy, minz, maxz);
                                                        pos.add(dx, dy, minz, maxz);
                                                        door.getTemplate().collisionHeight = maxz - minz & 0xfff0;
                                                        door.getTemplate().collisionRadius = Math.max(50, Math.min(posx - pos.getXmin(), posy - pos.getYmin()));
                                                        door.setXYZInvisible(posx, posy, minz + 32);
                                                        door.setCurrentHpMp(door.getMaxHp(), door.getMaxMp(), true);
                                                        door.setOpen(false);
                                                        door.level = level;
                                                        door.key = key;
                                                        // Дверь/стена может быть атакована только осадным оружием
                                                        door.setSiegeWeaponOlnyAttackable(siege_weapon);
                                                        door.setGeodata(geodata);
                                                        door.spawnMe(door.getLoc());
                                                        if(Config.debugDoor)
                                                        {
                                                                if(door.getTemplate().collisionRadius > 200)
                                                                {
                                                                        System.out.println("DoorId: " + id + ", collision: " + door.getTemplate().collisionRadius + ", posx: " + posx + ", posy: " + posy + ", xMin: " + pos.getXmin() + ", yMin: " + pos.getYmin());
                                                                }
                                                                if(pos.getXmin() == pos.getXmax())
                                                                {
                                                                        _log.warning("door " + id + " has zero size");
                                                                }
                                                                else if(pos.getYmin() == pos.getYmax())
                                                                {
                                                                        _log.warning("door " + id + " has zero size");
                                                                }
                                                        }
                                                }
                                        }
                                }
                        }
                }
                catch(Exception e)
                {
                        e.printStackTrace();
                }
                _log.info("DoorTable: Loaded " + _staticItems.size() + " doors.");
        }

        public boolean isInitialized()
        {
                boolean _initialized = true;
                return _initialized;
        }

        public L2DoorInstance getDoor(Integer id)
        {
                return _staticItems.get(id);
        }

        public void putDoor(Integer id, L2DoorInstance door)
        {
                _staticItems.put(id, door);
        }

        public void removeDoor(Integer id)
        {
                _staticItems.remove(id);
        }

        public L2DoorInstance[] getDoors()
        {
                return _staticItems.values().toArray(new L2DoorInstance[_staticItems.size()]);
        }

        /**
        * Performs a check and sets up a scheduled task for
        * those doors that require auto opening/closing.
        */
        public void checkAutoOpen()
        {
                for(L2DoorInstance doorInst : getDoors())
                // Garden of Eva (every 7 minutes)
                {
                        if(doorInst.getDoorName().startsWith("Eva_"))
                        {
                                doorInst.setAutoActionDelay(420000);
                        }
                        // Tower of Insolence (every 5 minutes)
                        else if(doorInst.getDoorName().startsWith("hubris_"))
                        {
                                doorInst.setAutoActionDelay(300000);
                        }
                        // Giran Devil island (every 5 minutes)
                        else if(doorInst.getDoorName().startsWith("Devil.opendoor"))
                        {
                                doorInst.setAutoActionDelay(300000);
                        }
                        // Coral Garden Gate (every 15 minutes)
                        else if(doorInst.getDoorName().startsWith("Coral_garden"))
                        {
                                doorInst.setAutoActionDelay(900000);
                        }
                        // Normil's cave (every 5 minutes)
                        else if(doorInst.getDoorName().startsWith("Normils_cave"))
                        {
                                doorInst.setAutoActionDelay(300000);
                        }
                        // Normil's Garden (every 15 minutes)
                        else if(doorInst.getDoorName().startsWith("Normils_garden"))
                        {
                                doorInst.setAutoActionDelay(900000);
                        }
                }
        }
}

Раньше в doors.xml мэтод geodata="true" имел значение false. При отрицательном значении можно было проходить через все двери, при значении True , цельные двери стали нормально работать, а двойные двери проходятся по центру стрелочками.

qweqwe1 17.11.2013 21:26

Re: Проходимость дверей.
 
Понятно, я про обычный l2j сказал, с l2p не работал

the2fantasy 17.11.2013 21:29

Re: Проходимость дверей.
 
Просто никогда не работал с редактированием геодаты, да и не особо стремлюсь.
Перепробовал куча разных версий квадратов 11_24, 11_25, 12_24, 12_25 с разных геодат, так ничего с дверьми и не решилось.

n3k0nation 17.11.2013 22:37

Re: Проходимость дверей.
 
Вам нужно корректировать "размер" дверей в геодате для правильной обработки коллизий, грубо говоря меш коллизии. Так же желательно доработать алгоритмику поиска пути, использовать другой алгоритм для поиска пути, если игрок играет на стрелках.

the2fantasy 17.11.2013 23:14

Re: Проходимость дверей.
 
geoeditor подойдет для таких действий?

или можно подправить сам квадрат с нужными дверьми в другой программе? если да то в какой подскажите пожалуйста.

gorodetskiy 17.11.2013 23:21

Re: Проходимость дверей.
 
Ответ кроется в ядре сервера, то что вы откроете редактор геодаты, откроете квадрат геодаты, Вам ничего это не даст, как откроете, так и закроете.

the2fantasy 18.11.2013 01:59

Re: Проходимость дверей.
 
тыкнете пальцем где)


Текущее время: 02:00. Часовой пояс GMT +3.

Powered by vBulletin® Version 3.8.6
Copyright ©2000 - 2021, Jelsoft Enterprises Ltd. Перевод: zCarot