package de.lighti.model; import java.util.Collection; import java.util.HashMap; import java.util.Map; import java.util.Vector; import de.lighti.DotaPlay; import de.lighti.GameEventListener; import de.lighti.model.state.EntityClass; import de.lighti.model.state.StateUtils.FlatSendTable; import de.lighti.model.state.StateUtils.SendProp; import de.lighti.util.BitInputBuffer; public class Entity { private static void readFieldList( Vector<Integer> fields, BitInputBuffer stream ) { int lastField = readFieldNumber( -1, stream ); while (lastField != -1) { fields.add( lastField ); lastField = readFieldNumber( lastField, stream ); } } private static int readFieldNumber( int lastField, BitInputBuffer stream ) { if (stream.readBit()) { return ++lastField; } else { final int value = stream.readVar35(); if (value == 0x3FFF) { return -1; } else { return lastField + value + 1; } } } private int id; private EntityClass eClass; private FlatSendTable flatSendTable; private Map<Integer, Property> properties; public Entity( int id ) { super(); this.id = id; properties = null; } public Entity( int id, EntityClass eClass, FlatSendTable flatSendTable ) { this( id ); this.eClass = eClass; this.flatSendTable = flatSendTable; } public EntityClass getEntityClass() { return eClass; } public int getId() { return id; } public Collection<Property> getProperties() { return properties.values(); } public Property getProperty( String name ) { if (properties == null) { return null; } for (final Property p : properties.values()) { if (p.getName().equals( name )) { return p; } } return null; } public void setId( int i ) { id = i; } @Override public String toString() { return "Entity [id=" + id + ", eClass=" + eClass + "]"; } public void update( BitInputBuffer stream ) { final boolean first = properties == null; if (first) { properties = new HashMap(); } final Vector<Integer> fields = new Vector(); readFieldList( fields, stream ); if (!first) { for (final Integer i : fields) { final Object old = properties.get( i ) != null ? properties.get( i ).getValue() : null; final SendProp prop = flatSendTable.getProps().get( i ); final Property p = Property.readProperty( stream, prop ); properties.put( i, p ); final Object newValue = properties.get( i ); for (final GameEventListener l : DotaPlay.getListeners()) { l.entityUpdated( DotaPlay.getTickMs(), this, properties.get( i ).getName(), old ); } } } else { for (final Integer i : fields) { final SendProp prop = flatSendTable.getProps().get( i ); final Property p = Property.readProperty( stream, prop ); properties.put( i, p ); } for (final GameEventListener l : DotaPlay.getListeners()) { l.entityCreated( DotaPlay.getTickMs(), this ); } } } }