2019-08-03 06:51:05 +00:00
/ *
2022-01-01 19:03:05 +00:00
* Copyright ( c ) 2019 - 2022 GeyserMC . http : //geysermc.org
2019-08-03 06:51:05 +00:00
*
* Permission is hereby granted , free of charge , to any person obtaining a copy
* of this software and associated documentation files ( the " Software " ) , to deal
* in the Software without restriction , including without limitation the rights
* to use , copy , modify , merge , publish , distribute , sublicense , and / or sell
* copies of the Software , and to permit persons to whom the Software is
* furnished to do so , subject to the following conditions :
*
* The above copyright notice and this permission notice shall be included in
* all copies or substantial portions of the Software .
*
* THE SOFTWARE IS PROVIDED " AS IS " , WITHOUT WARRANTY OF ANY KIND , EXPRESS OR
* IMPLIED , INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY ,
* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT . IN NO EVENT SHALL THE
* AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM , DAMAGES OR OTHER
* LIABILITY , WHETHER IN AN ACTION OF CONTRACT , TORT OR OTHERWISE , ARISING FROM ,
* OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
* THE SOFTWARE .
*
* @author GeyserMC
* @link https : //github.com/GeyserMC/Geyser
* /
2021-11-20 23:29:46 +00:00
package org.geysermc.geyser.translator.protocol.java.entity ;
2019-08-03 06:51:05 +00:00
2021-10-10 18:54:06 +00:00
import com.github.steveice10.mc.protocol.data.game.entity.metadata.EntityMetadata ;
2021-11-13 03:44:15 +00:00
import com.github.steveice10.mc.protocol.packet.ingame.clientbound.entity.ClientboundSetEntityDataPacket ;
2021-11-20 21:34:30 +00:00
import org.geysermc.geyser.entity.EntityDefinition ;
2022-01-22 21:22:27 +00:00
import org.geysermc.geyser.entity.InteractiveTagManager ;
import org.geysermc.geyser.entity.type.Entity ;
2021-11-22 19:52:26 +00:00
import org.geysermc.geyser.session.GeyserSession ;
2021-11-20 23:29:46 +00:00
import org.geysermc.geyser.translator.protocol.PacketTranslator ;
import org.geysermc.geyser.translator.protocol.Translator ;
2021-11-18 03:02:38 +00:00
2021-11-13 03:44:15 +00:00
@Translator ( packet = ClientboundSetEntityDataPacket . class )
2021-11-13 04:01:45 +00:00
public class JavaSetEntityDataTranslator extends PacketTranslator < ClientboundSetEntityDataPacket > {
2019-08-03 06:51:05 +00:00
2021-11-20 19:25:21 +00:00
@SuppressWarnings ( { " rawtypes " , " unchecked " } )
2019-08-03 06:51:05 +00:00
@Override
2021-11-22 19:52:26 +00:00
public void translate ( GeyserSession session , ClientboundSetEntityDataPacket packet ) {
2021-12-18 16:43:57 +00:00
Entity entity = session . getEntityCache ( ) . getEntityByJavaId ( packet . getEntityId ( ) ) ;
2019-09-25 21:52:28 +00:00
if ( entity = = null ) return ;
2019-08-03 06:51:05 +00:00
2021-11-20 19:25:21 +00:00
EntityDefinition < ? > definition = entity . getDefinition ( ) ;
for ( EntityMetadata < ? , ? > metadata : packet . getMetadata ( ) ) {
if ( metadata . getId ( ) > = definition . translators ( ) . size ( ) ) {
2021-11-20 21:34:30 +00:00
if ( session . getGeyser ( ) . getConfig ( ) . isDebugMode ( ) ) {
2021-12-13 18:25:51 +00:00
// Minecraft client just ignores these
session . getGeyser ( ) . getLogger ( ) . warning ( " Metadata ID " + metadata . getId ( ) + " is out of bounds of known entity metadata size " + definition . translators ( ) . size ( ) + " for entity type " + entity . getDefinition ( ) . entityType ( ) ) ;
2021-11-20 21:34:30 +00:00
session . getGeyser ( ) . getLogger ( ) . debug ( metadata . toString ( ) ) ;
2020-08-03 21:29:52 +00:00
}
2021-11-18 03:02:38 +00:00
continue ;
}
2021-11-20 19:25:21 +00:00
( ( EntityDefinition ) definition ) . translateMetadata ( entity , metadata ) ;
2019-08-03 06:51:05 +00:00
}
2020-07-30 20:15:07 +00:00
2021-11-18 03:02:38 +00:00
entity . updateBedrockMetadata ( ) ;
2021-03-18 05:11:21 +00:00
// Update the interactive tag, if necessary
if ( session . getMouseoverEntity ( ) ! = null & & session . getMouseoverEntity ( ) . getEntityId ( ) = = entity . getEntityId ( ) ) {
InteractiveTagManager . updateTag ( session , entity ) ;
}
2019-08-03 06:51:05 +00:00
}
}