Source SDK

Source SDK

Not enough ratings
Rotating Pickups - Motor Source
By H-H-G-M
En este tutorial crearemos una entidad de recogida de salud giratoria, como las de TF2. Cuando un jugador pase por encima ganará algo de salud y el objeto desaparecerá hasta que se complete un temporizador de reaparición.

guía original de valve
https://developer.valvesoftware.com/wiki/Rotating_Pickups
   
Award
Favorite
Favorited
Unfavorite
Código
Consigue el código aquí.[pastebin.com] Deberías estar familiarizado con la creación de entidades, por lo que sólo se elegirán las partes interesantes.
Funcionalidad
Servidor "server"
Inicializar la entidad como disparador
Asegúrate de que el elemento flota sobre cualquier superficie transitable
Crear un decal para marcar la posición del objeto cuando es invisible
Manejar los toques de los jugadores (dar salud, reproducir un sonido de reaparición)
Cliente "client"
Rotar el modelo
Manejar la visibilidad del modelo
Server
Spawn()
Nótese cómo algunos de los cambios de CItem tienen que ser deshechos (no está diseñado pensando en objetos flotantes imposibles). Source es un motor grande y maduro, y siempre vale la pena comprobar lo que hacen sus clases base.
Estamos estableciendo MdlTop antes de juguetear con la caja delimitadora. Esto se usará cuando se reposicione la entidad; si sólo usáramos el origen, entonces si/cuando se use un modelo más grande podría llegar tan alto que oscurezca la vista del jugador.
Activar()
Aquí trazamos hasta la altura deseada, añadiendo a la posición Z de la entidad si nos quedamos cortos. Esto se hace en Activate() en lugar de Spawn() en caso de que hayamos desovado antes que la entidad que tenemos debajo.
Aquí es también donde disparamos una calcomanía al suelo. Esto puede quedar mal ena lgunos casos, por lo que se proporciona una bandera para omitir la llamada.
Precache()
Necesitamos obtener el valor de retorno de UTIL_PrecacheDecal(), pero Precace() se llama estáticamente (es decir, directamente, no a través de ninguna instancia de la clase). Almacenar el valor en una variable global es la única solución sensata.
Client
ClientePensar()
C_RotatingPickup::ClientRotAng se utiliza para rotar el modelo, no la variable incorporada de CBaseEntity. Esto se debe a que, aunque esta última ha sido excluida de la tabla de datos de esta entidad, todavía se pone a cero cuando la entidad se materializa (sospecho que CItem está restableciendo la ubicación de la entidad a través de algún tipo de puerta trasera). El hecho de no llamar a GetAbsAngles() también supone una pequeña mejora de rendimiento.
PostDataUpdate()
Si has mirado los proxies de recepción, te preguntarás por qué estamos probando contra un valor en caché cuando podríamos simplemente engancharnos a la recepción de uno actualizado. Dos razones:
No puedes tener proxies en RecvPropBool().
Los proxies son estáticos y nunca, nunca deben ser utilizados para ejecutar la lógica de la entidad. Los proxies de recepción son llamados no sólo cuando se reciben actualizaciones de la entidad, sino también cuando se validan los valores predichos. Es muy posible que un proxy sea reutilizado por otra entidad también.