Search in sources :

Example 1 with Attribute

use of org.apollo.game.model.entity.attr.Attribute in project apollo by apollo-rsps.

the class BinaryPlayerSerializer method loadPlayer.

@Override
public PlayerLoaderResponse loadPlayer(PlayerCredentials credentials) throws IOException {
    Path path = getFile(credentials.getUsername());
    if (!Files.exists(path)) {
        Player player = new Player(world, credentials, TUTORIAL_ISLAND_SPAWN);
        credentials.setPassword(SCryptUtil.scrypt(credentials.getPassword(), 16384, 8, 1));
        return new PlayerLoaderResponse(LoginConstants.STATUS_OK, player);
    }
    try (DataInputStream in = new DataInputStream(new BufferedInputStream(Files.newInputStream(path)))) {
        String name = StreamUtil.readString(in);
        String password = StreamUtil.readString(in);
        if (!name.equalsIgnoreCase(credentials.getUsername()) || !SCryptUtil.check(credentials.getPassword(), password)) {
            return new PlayerLoaderResponse(LoginConstants.STATUS_INVALID_CREDENTIALS);
        }
        // Update password to the hashed one.
        credentials.setPassword(password);
        PrivilegeLevel privilege = PrivilegeLevel.valueOf(in.readByte());
        MembershipStatus members = MembershipStatus.valueOf(in.readByte());
        PrivacyState chatPrivacy = PrivacyState.valueOf(in.readByte(), true);
        PrivacyState friendPrivacy = PrivacyState.valueOf(in.readByte(), false);
        PrivacyState tradePrivacy = PrivacyState.valueOf(in.readByte(), false);
        ScreenBrightness brightness = ScreenBrightness.valueOf(in.readByte());
        int x = in.readUnsignedShort();
        int y = in.readUnsignedShort();
        int height = in.readUnsignedByte();
        Gender gender = in.readUnsignedByte() == Gender.MALE.toInteger() ? Gender.MALE : Gender.FEMALE;
        int[] style = new int[7];
        for (int slot = 0; slot < style.length; slot++) {
            style[slot] = in.readUnsignedByte();
        }
        int[] colors = new int[5];
        for (int slot = 0; slot < colors.length; slot++) {
            colors[slot] = in.readUnsignedByte();
        }
        Player player = new Player(world, credentials, new Position(x, y, height));
        player.setPrivilegeLevel(privilege);
        player.setMembers(members);
        player.setChatPrivacy(chatPrivacy);
        player.setFriendPrivacy(friendPrivacy);
        player.setTradePrivacy(tradePrivacy);
        player.setScreenBrightness(brightness);
        player.setAppearance(new Appearance(gender, style, colors));
        readInventory(in, player.getInventory());
        readInventory(in, player.getEquipment());
        readInventory(in, player.getBank());
        int size = in.readUnsignedByte();
        SkillSet skills = player.getSkillSet();
        skills.stopFiringEvents();
        try {
            for (int i = 0; i < size; i++) {
                int level = in.readUnsignedByte();
                double experience = in.readDouble();
                skills.setSkill(i, new Skill(experience, level, SkillSet.getLevelForExperience(experience)));
            }
        } finally {
            skills.calculateCombatLevel();
            skills.startFiringEvents();
        }
        int friendCount = in.readByte();
        List<String> friends = new ArrayList<>(friendCount);
        for (int i = 0; i < friendCount; i++) {
            friends.add(NameUtil.decodeBase37(in.readLong()));
        }
        player.setFriendUsernames(friends);
        int ignoreCount = in.readByte();
        List<String> ignores = new ArrayList<>(ignoreCount);
        for (int times = 0; times < ignoreCount; times++) {
            ignores.add(NameUtil.decodeBase37(in.readLong()));
        }
        player.setIgnoredUsernames(ignores);
        Map<String, Attribute<?>> attributes = readAttributes(in);
        attributes.forEach(player::setAttribute);
        if (player.isBanned()) {
            return new PlayerLoaderResponse(LoginConstants.STATUS_ACCOUNT_DISABLED);
        }
        return new PlayerLoaderResponse(LoginConstants.STATUS_OK, player);
    }
}
Also used : Path(java.nio.file.Path) MembershipStatus(org.apollo.game.model.entity.setting.MembershipStatus) Player(org.apollo.game.model.entity.Player) Position(org.apollo.game.model.Position) NumericalAttribute(org.apollo.game.model.entity.attr.NumericalAttribute) BooleanAttribute(org.apollo.game.model.entity.attr.BooleanAttribute) Attribute(org.apollo.game.model.entity.attr.Attribute) StringAttribute(org.apollo.game.model.entity.attr.StringAttribute) ArrayList(java.util.ArrayList) PrivacyState(org.apollo.game.model.entity.setting.PrivacyState) Gender(org.apollo.game.model.entity.setting.Gender) DataInputStream(java.io.DataInputStream) PrivilegeLevel(org.apollo.game.model.entity.setting.PrivilegeLevel) Appearance(org.apollo.game.model.Appearance) Skill(org.apollo.game.model.entity.Skill) ScreenBrightness(org.apollo.game.model.entity.setting.ScreenBrightness) BufferedInputStream(java.io.BufferedInputStream) SkillSet(org.apollo.game.model.entity.SkillSet)

Example 2 with Attribute

use of org.apollo.game.model.entity.attr.Attribute in project apollo by apollo-rsps.

the class BinaryPlayerSerializer method readAttributes.

/**
 * Reads the player's {@link Attribute}s.
 *
 * @param in The input stream.
 * @return The {@link Map} of attribute names to attributes.
 * @throws IOException If there is an error reading from the stream.
 */
private Map<String, Attribute<?>> readAttributes(DataInputStream in) throws IOException {
    int count = in.readInt();
    Map<String, Attribute<?>> attributes = new HashMap<>(count);
    for (int times = 0; times < count; times++) {
        String name = StreamUtil.readString(in);
        AttributeType type = AttributeType.valueOf(in.read());
        Attribute<?> attribute;
        switch(type) {
            case BOOLEAN:
                attribute = new BooleanAttribute(in.read() == 1);
                break;
            case DOUBLE:
                attribute = new NumericalAttribute(in.readDouble());
                break;
            case LONG:
                attribute = new NumericalAttribute(in.readLong());
                break;
            case STRING:
            case SYMBOL:
                attribute = new StringAttribute(StreamUtil.readString(in), type == AttributeType.SYMBOL);
                break;
            default:
                throw new IllegalArgumentException("Undefined attribute type: " + type + ".");
        }
        attributes.put(name, attribute);
    }
    return attributes;
}
Also used : BooleanAttribute(org.apollo.game.model.entity.attr.BooleanAttribute) NumericalAttribute(org.apollo.game.model.entity.attr.NumericalAttribute) BooleanAttribute(org.apollo.game.model.entity.attr.BooleanAttribute) Attribute(org.apollo.game.model.entity.attr.Attribute) StringAttribute(org.apollo.game.model.entity.attr.StringAttribute) HashMap(java.util.HashMap) AttributeType(org.apollo.game.model.entity.attr.AttributeType) NumericalAttribute(org.apollo.game.model.entity.attr.NumericalAttribute) StringAttribute(org.apollo.game.model.entity.attr.StringAttribute)

Example 3 with Attribute

use of org.apollo.game.model.entity.attr.Attribute in project apollo by apollo-rsps.

the class BinaryPlayerSerializer method savePlayer.

@Override
public void savePlayer(Player player) throws IOException {
    Path file = getFile(player.getUsername());
    try (DataOutputStream out = new DataOutputStream(Files.newOutputStream(file))) {
        StreamUtil.writeString(out, player.getUsername());
        StreamUtil.writeString(out, player.getCredentials().getPassword());
        out.writeByte(player.getPrivilegeLevel().toInteger());
        out.writeByte(player.getMembershipStatus().getValue());
        out.writeByte(player.getChatPrivacy().toInteger(true));
        out.writeByte(player.getFriendPrivacy().toInteger(false));
        out.writeByte(player.getTradePrivacy().toInteger(false));
        out.writeByte(player.getScreenBrightness().toInteger());
        Position position = player.getPosition();
        out.writeShort(position.getX());
        out.writeShort(position.getY());
        out.writeByte(position.getHeight());
        Appearance appearance = player.getAppearance();
        out.writeByte(appearance.getGender().toInteger());
        int[] style = appearance.getStyle();
        for (int element : style) {
            out.writeByte(element);
        }
        int[] colors = appearance.getColors();
        for (int color : colors) {
            out.writeByte(color);
        }
        writeInventory(out, player.getInventory());
        writeInventory(out, player.getEquipment());
        writeInventory(out, player.getBank());
        SkillSet skills = player.getSkillSet();
        out.writeByte(skills.size());
        for (int id = 0; id < skills.size(); id++) {
            Skill skill = skills.getSkill(id);
            out.writeByte(skill.getCurrentLevel());
            out.writeDouble(skill.getExperience());
        }
        List<String> usernames = player.getFriendUsernames();
        out.writeByte(usernames.size());
        for (String username : usernames) {
            out.writeLong(NameUtil.encodeBase37(username));
        }
        usernames = player.getIgnoredUsernames();
        out.writeByte(usernames.size());
        for (String username : usernames) {
            out.writeLong(NameUtil.encodeBase37(username));
        }
        Set<Entry<String, Attribute<?>>> attributes = player.getAttributes().entrySet();
        attributes.removeIf(e -> AttributeMap.getDefinition(e.getKey()).getPersistence() != AttributePersistence.PERSISTENT);
        out.writeInt(attributes.size());
        for (Entry<String, Attribute<?>> entry : attributes) {
            String name = entry.getKey();
            StreamUtil.writeString(out, name);
            Attribute<?> attribute = entry.getValue();
            out.writeByte(attribute.getType().getValue());
            out.write(attribute.encode());
        }
    }
}
Also used : Path(java.nio.file.Path) Position(org.apollo.game.model.Position) NumericalAttribute(org.apollo.game.model.entity.attr.NumericalAttribute) BooleanAttribute(org.apollo.game.model.entity.attr.BooleanAttribute) Attribute(org.apollo.game.model.entity.attr.Attribute) StringAttribute(org.apollo.game.model.entity.attr.StringAttribute) DataOutputStream(java.io.DataOutputStream) Appearance(org.apollo.game.model.Appearance) Skill(org.apollo.game.model.entity.Skill) Entry(java.util.Map.Entry) SkillSet(org.apollo.game.model.entity.SkillSet)

Aggregations

Attribute (org.apollo.game.model.entity.attr.Attribute)3 BooleanAttribute (org.apollo.game.model.entity.attr.BooleanAttribute)3 NumericalAttribute (org.apollo.game.model.entity.attr.NumericalAttribute)3 StringAttribute (org.apollo.game.model.entity.attr.StringAttribute)3 Path (java.nio.file.Path)2 Appearance (org.apollo.game.model.Appearance)2 Position (org.apollo.game.model.Position)2 Skill (org.apollo.game.model.entity.Skill)2 SkillSet (org.apollo.game.model.entity.SkillSet)2 BufferedInputStream (java.io.BufferedInputStream)1 DataInputStream (java.io.DataInputStream)1 DataOutputStream (java.io.DataOutputStream)1 ArrayList (java.util.ArrayList)1 HashMap (java.util.HashMap)1 Entry (java.util.Map.Entry)1 Player (org.apollo.game.model.entity.Player)1 AttributeType (org.apollo.game.model.entity.attr.AttributeType)1 Gender (org.apollo.game.model.entity.setting.Gender)1 MembershipStatus (org.apollo.game.model.entity.setting.MembershipStatus)1 PrivacyState (org.apollo.game.model.entity.setting.PrivacyState)1