aboutsummaryrefslogtreecommitdiff
path: root/src/ecs/char_controller.moon
blob: e5e3db7caf69cdc651122e9ac6a7d33dd74d5123 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
ScriptComponent = require("ecs.script")
win = require("window")
log = require("log")
world = require("world")

class CharacterControllerComponent extends ScriptComponent
	new: (name, properties, netc_name) =>
		log.info("Creating new character controller", {"ecs"})
		properties.script = () ->
			--log.info("Character controller running", {"ecs"})
			any_change = false
			assert(@net.__class.__name == "ClientNetworkedComponent", "Wrong net component, was a " .. @net.__class.__name)
			assert(@pred,"No predicted component")
			assert(world.network, "Network must be created before CharacterControllerComponent starts running")
			if win\key_pressed("w")
				log.info("Key down w",{"net","ecs","client","player"})
				@net.properties.acc[2] = 1
				any_change = true
			elseif win\key_released("w")
				log.info("Key up w",{"net","ecs","client","player"})
				any_change = true
				@net.properties.acc[2] = 0
			if win\key_pressed("s")
				log.info("Key down s",{"net","ecs","client","player"})
				any_change = true
				@net.properties.acc[2] = -1
			elseif win\key_released("s")
				log.info("Key up s",{"net","ecs","client","player"})
				any_change = true
				@net.properties.acc[2] = 0
			if win\key_pressed("a")
				log.info("Key down a", {"net","ecs","client","player"})
				any_change = true
				@net.properties.acc[1] = -1
			elseif win\key_released("a")
				log.info("Key up a", {"net","ecs","client","player"})
				any_change = true
				@net.properties.acc[1] = 0
			if win\key_pressed("d")
				log.info("Key down d", {"net","ecs","client","player"})
				any_change = true
				@net.properties.acc[1] = 1
			elseif win\key_released("d")
				log.info("Key up d", {"net","ecs","client","player"})
				any_change = true
				@net.properties.acc[1] = 0
			
			-- We can't actually update the network on the client,
			-- but we still want to do predicted movement
			if any_change
				@net.properties.last_update = am.eval_js("Date.now();")
				@net.properties.pos = @pred.properties.pos
				--@net.properties.vel = @pred.properties.vel
				world.network\send("SuggestPlayerUpdate",{
					acc: @net.properties.acc
					vel: @net.properties.vel
					pos: @pred.properties.pos
				})
			return false
			--print("Running character controller",win\key_pressed("w"))
		@netc_name = netc_name
		super(name, properties)
	join: (entity) =>
		log.debug("Components was:" .. tostring(entity.components), {"ecs"})
		@net = entity\get(@netc_name)
		@pred = entity\get("pred")
		assert(@net, "Must have added network component: " .. @netc_name .. ".")
		super(entity)

CharacterControllerComponent