Hello, I’m trying with the help of the uefn beta to make changes to the look, but I can’t get anything to work for me. Is there anyone who understands verse programming and can help me make changes to a verse file? It is from the official template, I don’t like how it does one function or I prefer another, but the beta AI is not helping me at all.
Hey @D3d how are you?
I could help you if you provide more details about what you want to do and which template are you trying to use. So I can check it for you and help with the modifications!
If you preffer to use Spanish you can, I speak Spanish as well! But please, be as detailed as you could and provide the code you are working on!
I’ll be waiting for your answer!
Vale, pues te comento. El sistema en la plantilla oficial de prop_hunt.verse de caza de elementos, me gustaría cambiar el sistema de reparto de equipos realizado con la forma “shufle” creo que se dice así, que hace que sea aleatorio la selección del cazador, y el resto son props. En el caso que en el verse config editables, se cambie el 1 hunter por cada 5 jugadores, eso no es ningun problema que se pueda escoger cantidad de cazadores. El problema es que el sistema original, puede repetir siempre que sea el mismo cazador cada ronda. Intento averiguar con el desarollador beta de verse, pero no hay manera de que funcione nada.
Mi idea era o bien que el cazador sea el que menos eliminaciones tenga, o que puedan votar quien quiere cazar, o cualquier otro sistema (no repita dos o tres rondas seguidas, etc)
Hola de nuevo @D3d !
Entiendo que lo que no debería pasar es que se repitan los cazadores en rondas sucesivas.
La forma que encontré de hacer esto es la siguiente:
(los comentarios del código van a estar en inglés para que sean útiles para la mayor cantidad de gente posible)
- Crear un map que use como key el Player/Agent y como value un logic (false/true) para llevar registro de quienes ya fueron elegidos como Hunters la ronda anterior.
Se crea de la siguiente manera:
var LastRoundHunters : [agent]logic = map{}
- Crear una función para inicializar ese map con todos los jugadores que existen actualmente en la Isla y ponerlos en false. Debes llamar esta función en el OnBegin:
OnBegin<override>()<suspends>:void =
# Initializer function called OnBegin
InitializeLastRoundHuntersMap()
# Store all current players and initialize them "false" in the map
InitializeLastRoundHuntersMap() : void =
# Iterate all the players that are currently on the Island
for ( Player : GetPlayspace().GetPlayers() ):
# Add each player one by one to the map with default value "false"
if ( set LastRoundHunters[ Player ] = false ):
- Crear una función para obtener todos los players que pueden ser seleccionados como Hunter en la próxima ronda (todos los players con value false en el map). Esta función deberías llamarla inmediatamente antes de setear la variable “NumberOfParticipants” dentro de la función “SetUpTeams” (adjunto una imagen luego del codigo):
# This function creates an array with all the players who were not hunters in the last round
GetPossibleHunters() : void =
# Creates an auxiliary array
var AuxArray : []agent = array{}
# Iterates the LastRoundHunters
for (Key -> WasHunter : LastRoundHunters):
# Check if the current player was a hunter in the last round
if (WasHunter = false):
# Adds the player to the list if it was not a hunter in the last round
if (AuxArray = AuxArray + array{Key}):
# Assign the values from the auxiliary array to our PossibleHunters array
if (PossibleHunters = AuxArray):
- Crear una función para obtener todos los players que NO fueron seleccionados como Hunters en la función anterior. Esta función la llamaremos en el siguiente punto:
# This functions returns an array with all the players who were not chosen as hunters for this round
GetPropPlayers( Participants:[]agent, StartingHunters:[]agent ) : []agent =
# Creates an auxiliary array
var AuxArray : []agent = array{}
# Iterates over all the participants
for ( Player : Participants ):
# Iterates over all the current hunters
for ( Hunter : StartingHunters ):
# Checks if the player will be a hunter this round
if ( Player = Hunter ):
else:
# Adds the player to the list if it will be not a hunter this round
if (AuxArray = AuxArray + array{Player}):
return AuxArray
- Modificar la función “SetUpTeams” para utilizar las funciones creadas anteriormente. Aquí cambiaremos varias partes, se detallan en el siguiente código:
# Shuffle the participants and then slice the array to get the starting hunter agents. The remaining participants are the starting prop agents.
# This is line "var RandomizedParticipants:[]agent = Shuffle(Participants)" is modified in the next one
var RandomizedParticipants:[]agent = Shuffle(PossibleHunters)
set StartingHunterAgents = RandomizedParticipants.Slice[0,NumberOfStartingHunters] or StartingHunterAgents
#This is line "set StartingPropAgents = RandomizedParticipants.Slice[NumberOfStartingHunters,RandomizedParticipants.Length] or StartingPropAgents" is modified in the next one
set StartingPropAgents = GetPropPlayers(Participants, StartingHunterAgents)
Con estas modificaciones, lo que debería pasar es que cada vez que se determinan los Hunters para la siguiente ronda se excluyen de la lista de selección todos los players que fueron Hunters la ronda anterior. Evitando que se repitan Hunters ronda tras ronda.
Adicionalmente, te dejo dos funciones mas para manejar las posibilidades de que entren nuevos jugadores a la isla (hay que agregarlos al map) y de que algunos jugadores se vayan de la isla (hay que quitarlos del map).
Estas funciones deberias llamarlas en el OnBegin luego de la función de inicialización que creaste en el punto 2:
OnBegin<override>()<suspends>:void =
GetPlayspace().PlayerAddedEvent().Subscribe( AddNewPlayerToLastRoundHuntersMap )
GetPlayspace().PlayerRemovedEvent().Subscribe( RemovePlayerFromLastRoundHuntersMap )
La funcón para agregar jugadores al map cuando se conectan a la Isla es:
# This function executes when a new player joins the Island and adds that player to the LastRoundHunters map
AddNewPlayerToLastRoundHuntersMap( Player : agent ) : void =
if ( set LastRoundHunters[ Player ] = false ):
La función para quitar jugadores del map cuando abandonan la Isla es:
# This function executes when a player leaves the Island and removes that player from the LastRoundHunters map
RemovePlayerFromLastRoundHuntersMap( Player : agent ) : void =
# Creates an auxiliary map to "copy" the LastRoundHunters map but with the player already removed
var AuxMap : [agent]logic = map{}
# Iterates over the LastRoundHunters map and stores all the player but the removed on the auxiliary map
for (Key -> Value : LastRoundHunters, Key <> Player):
set AuxMap = ConcatenateMaps(AuxMap, map{Key => Value})
# Finally, sets the LastRoundHunters with the updated values from the auxiliary map
set LastRoundHunters = AuxMap
Espero que esto te sea de utilidad para lo que necesitas! Dejame saber si funciona correctamente o si necesitas mas ayuda!
Vale, he conseguido terminar ahora con ayuda de la ia para entender un poco donde iba cada cosa, me aconsejo un var de esos iniciales pk me daba a entender que faltaría por añadir. Una vez todo puesto, mañana probaré con un amigo a ver como funciona.
Y por cierto, ya puestos… y añadir a todo esto eso nuevo que veo que se llama ronda infinita ??
O sea, añadir si se puede al código que en vez de finalizar ronda, cuando ganen cazadores o props, los reenvie a la sala de nuevo eespues de dar la victoria a uno o al otro, y que vuelva a empezar con el round start..
Lo que llaman ronda infinita.
Es muy lioso ??
Vale he podido hacer la prueba pero por ahora con bots (la opción de personalizado y he añadido 3 bots)
En total yo y 3 bots. Pero la prueba no ha funcionado. Aún lo he tengo que probar con otro player.
Pero con bots no funciona por este motivo:
- Iniciamos en la pre-sala, hace la cuenta atrás (ya de por si salimos todos con el pico (solo deberian salir cazadores), y cuando acaba el contador de ronda en 5..4..3..2.1… No cambia a ninguna clase, y no teletransporta a nadie. Es como si no nos metiera en la clase. Aparte que con el pico no consigo matar a ninguno, y veo a uno de ellos con el nombre en la cabeza como si ese fuera de mi equipo.
Puse armas en el team settings, y visualizar la tabla de puntuación. Yo soy teóricamente del equipo props, y llevo equipada el arma del team settings inventory del equipo props. (Pero no el de la clase) Imagino que los bots será lo mismo.
O sea, creo que no nos cambia la clase. Por eso falla al inicio.
Probaré con un player y te comentaré si sucede algo similar.
En la presa-la no teleporta a nadie. (No sé si será por lo de la clase)
Ah, y con los bots, durante 4 o 5 rondas, siempre salgo asi:
Como puedes ver, mismo equipo y sin clase. Asi ronda tras ronda. Se replica. Falta creo que lo de la clase.
Te añado 4 imagenes del codigo agregado, por si algo lo colocara mal, pues no me da errores.
Las marcadas con ### son las añadidas.
Hola nuevamente @D3d
Antes que nada, te pido disculpas por el error!
En la funcion GetPossibleHunters(), la ultima linea es “if (PossibleHunters = AuxArray):” pero deberia ser “set PossibleHunters = AuxArray”.
Con eso deberia funcionar perfectamente!
Adicionalmente, como sugerencia, te recomiendo que todas las funciones nuevas las pongas por debajo del “OnBegin”, ya que eso facilita mucho la lectura del codigo!
Por lo general se dejan todas las variables encima de OnBegin y todas las funciones debajo. Aunque no es una regla, es lo que suele hacerse para tener una lectura mas sencilla del codigo.
Saludos! Y espero que esta vez funcione correctamente!
(post deleted by author)
Hice el cambio pero sigue igual, no hace nada como puse en las imagenes, no teleporta, no asigna random, nada.







