Projectile Launcher Gizmo In Typescript!
I am super excited to share a TS Projectile Launcher Tutorial! 😄 I have covered this in Codeblocks so many times, but this is the first time in TS, definitely going to come back and expand on this in a future video, so let me know what you want to see in that video 🙂35Views0likes0CommentsTeam Manager Example - MHCP Mentor
I put together some basic example code for using the Team API found under the World class here. Asset can be found under the name Team Manager Example - MHCP Mentor in the public asset library. Known Issues While developing this I ran into an issue where the codeblockevent OnPlayerChangedTeams would sometimes stop firing after stopping and starting the world. I had to leave the world and come back. import * as hz from 'horizon/core'; class Teams extends hz.Component<typeof Teams> { static propsDefinition = { group1TeamATrigger: { type: hz.PropTypes.Entity }, group1TeamAMemberlist: { type: hz.PropTypes.Entity }, group1TeamBTrigger: { type: hz.PropTypes.Entity }, group1TeamBMemberlist: { type: hz.PropTypes.Entity }, group2TeamATrigger: { type: hz.PropTypes.Entity }, group2TeamAMemberlist: { type: hz.PropTypes.Entity }, group2TeamBTrigger: { type: hz.PropTypes.Entity }, group2TeamBMemberlist: { type: hz.PropTypes.Entity } }; preStart(): void { if (this.props.group1TeamATrigger) { this.connectCodeBlockEvent(this.props.group1TeamATrigger, hz.CodeBlockEvents.OnPlayerEnterTrigger, (enteredBy: hz.Player) => this.group1TeamATriggerEntered(enteredBy)) } else { console.warn('group1TeamATrigger property is not set.'); } if (this.props.group1TeamBTrigger) { this.connectCodeBlockEvent(this.props.group1TeamBTrigger, hz.CodeBlockEvents.OnPlayerEnterTrigger, (enteredBy: hz.Player) => this.group1TeamBTriggerEntered(enteredBy)) } else { console.warn('group1TeamBTrigger property is not set.'); } if (this.props.group2TeamATrigger) { this.connectCodeBlockEvent(this.props.group2TeamATrigger, hz.CodeBlockEvents.OnPlayerEnterTrigger, (enteredBy: hz.Player) => this.group2TeamATriggerEntered(enteredBy)) } else { console.warn('group2TeamATrigger property is not set.'); } if (this.props.group2TeamBTrigger) { this.connectCodeBlockEvent(this.props.group2TeamBTrigger, hz.CodeBlockEvents.OnPlayerEnterTrigger, (enteredBy: hz.Player) => this.group2TeamBTriggerEntered(enteredBy)) } else { console.warn('group2TeamBTrigger property is not set.'); } this.connectCodeBlockEvent(this.entity, hz.CodeBlockEvents.OnPlayerChangedTeam, (player: hz.Player, teamName: string, teamGroupName: string) => this.teamChanged(player, teamName, teamGroupName)); } start() { this.world.team.createTeamGroup('Group 1'); this.world.team.createTeamGroup('Group 2'); this.world.team.createTeam('Team A', 'Group 1') this.world.team.createTeam('Team B', 'Group 1') this.world.team.createTeam('Team A', 'Group 2') this.world.team.createTeam('Team B', 'Group 2') } teamChanged(player: hz.Player, teamName: string, teamGroupName: string) { console.log(`Player ${player.name.get()} changed to team ${teamName} in group ${teamGroupName}`); this.displayMemberlist(); } group1TeamATriggerEntered(enteredBy: hz.Player) { this.world.team.addPlayerToTeam(enteredBy, 'Team A', 'Group 1'); console.log(`Player ${enteredBy.name.get()} was added to the group1TeamA team.`); } group1TeamBTriggerEntered(enteredBy: hz.Player) { this.world.team.addPlayerToTeam(enteredBy, 'Team B', 'Group 1'); console.log(`Player ${enteredBy.name.get()} was added to the group1TeamB team.`); } group2TeamATriggerEntered(enteredBy: hz.Player) { this.world.team.addPlayerToTeam(enteredBy, 'Team A', 'Group 2'); console.log(`Player ${enteredBy.name.get()} was added to the group2TeamA team.`); } group2TeamBTriggerEntered(enteredBy: hz.Player) { this.world.team.addPlayerToTeam(enteredBy, 'Team B', 'Group 2'); console.log(`Player ${enteredBy.name.get()} was added to the group2TeamB team.`); } displayMemberlist() { const group1TeamBMemberlist = this.props.group1TeamBMemberlist; const group1TeamAMemberlist = this.props.group1TeamAMemberlist; const group2TeamAMemberlist = this.props.group2TeamAMemberlist; const group2TeamBMemberlist = this.props.group2TeamBMemberlist; if (group1TeamBMemberlist && group1TeamAMemberlist && group2TeamAMemberlist && group2TeamBMemberlist) { let group1TeamBPlayers: string = '' let group1TeamAPlayers: string = '' let group2TeamAPlayers: string = '' let group2TeamBPlayers: string = '' this.world.team.getTeamPlayers(this.world, 'Team B', 'Group 1').forEach(player => { group1TeamBPlayers += `${player.name.get()}<br> `; }); this.world.team.getTeamPlayers(this.world, 'Team A', 'Group 1').forEach(player => { group1TeamAPlayers += `${player.name.get()}<br> `; }); this.world.team.getTeamPlayers(this.world, 'Team A', 'Group 2').forEach(player => { group2TeamAPlayers += `${player.name.get()}<br> `; }); this.world.team.getTeamPlayers(this.world, 'Team B', 'Group 2').forEach(player => { group2TeamBPlayers += `${player.name.get()}<br> `; }); group1TeamBMemberlist.as(hz.TextGizmo).text.set(`${group1TeamBPlayers}`); group1TeamAMemberlist.as(hz.TextGizmo).text.set(`${group1TeamAPlayers}`); group2TeamAMemberlist.as(hz.TextGizmo).text.set(`${group2TeamAPlayers}`); group2TeamBMemberlist.as(hz.TextGizmo).text.set(`${group2TeamBPlayers}`); } else { console.warn('One or more memberlist properties are not set.'); } } } hz.Component.register(Teams);103Views0likes0CommentsAn Introduction To Typescript
Here's a tutorial I thought I'd made, but once I realized there was nothing even close, I finally did it. A true beginner starting guide to Typescript. I had to swallow a hard truth, which is anytime I have ever tried to do this, I always wanted to give you a finished product to be proud of at the end. But that isn't feasible in Typescript, things take a lot more work and explaining.... I know this is a 4.5hr tutorial, but for those of you just starting, or struggling with Typescript I hope this helps! I imagine if you follow along, this is a good 2-3 days with adequate breaks, and please do share any feedback or areas that you are still struggling with. I've got a lot on my plate this summer, but it includes a lot of Horizon tutorials, so really excited to see how far we'll go. See you in the next one! 💜 Video: https://youtu.be/Okoum6PWpYU Starter Environment: https://typescriptlang.org/play/235Views9likes1CommentRace Time Leaderboard In Horizon Worlds! (TS & Codeblocks)
Today we look at how to script a timer for a race leaderboard using both Codeblocks and Typescript. Where when the start trigger is entered we track the time entered, and when the end trigger is entered we calculate the time elapsed and record it to the player's Leaderboard. Download the script: https://drive.google.com/drive/u/1/folders/1Az7hsaAMWt2idZe9r_JYfmU1_IRz3htP180Views6likes0Comments