forked from pikdum/thistle_tea
-
Notifications
You must be signed in to change notification settings - Fork 0
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
still need to figure out: * why can they be walked through? * interactivity * seasonal decorations are all active simultaneously
- Loading branch information
Showing
10 changed files
with
271 additions
and
5 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,79 @@ | ||
defmodule ThistleTea.GameObject do | ||
use GenServer | ||
import ThistleTea.Game.UpdateObject, only: [generate_packet: 4] | ||
import Bitwise, only: [|||: 2] | ||
require Logger | ||
|
||
@game_object_guid_offset 0xF1100000 | ||
|
||
@update_type_create_object2 3 | ||
@object_type_game_object 5 | ||
|
||
@update_flag_all 0x10 | ||
@update_flag_has_position 0x40 | ||
|
||
def start_link(game_object) do | ||
GenServer.start_link(__MODULE__, game_object) | ||
end | ||
|
||
def update_packet(state) do | ||
fields = | ||
%{ | ||
object_guid: state.game_object.guid, | ||
object_type: @object_type_game_object, | ||
object_entry: state.game_object.id, | ||
object_scale_x: state.game_object.game_object_template.size, | ||
game_object_display_id: state.game_object.game_object_template.display_id, | ||
game_object_flags: state.game_object.game_object_template.flags, | ||
game_object_rotation0: state.game_object.rotation0, | ||
game_object_rotation1: state.game_object.rotation1, | ||
game_object_rotation2: state.game_object.rotation2, | ||
game_object_rotation3: state.game_object.rotation3, | ||
game_object_state: state.game_object.state, | ||
game_object_pos_x: state.game_object.position_x, | ||
game_object_pos_y: state.game_object.position_y, | ||
game_object_pos_z: state.game_object.position_z, | ||
game_object_type_id: state.game_object.game_object_template.type, | ||
game_object_animprogress: state.game_object.animprogress | ||
} | ||
|
||
mb = %{ | ||
update_flag: @update_flag_all ||| @update_flag_has_position, | ||
x: state.game_object.position_x, | ||
y: state.game_object.position_y, | ||
z: state.game_object.position_z, | ||
orientation: state.game_object.orientation | ||
} | ||
|
||
generate_packet(@update_type_create_object2, @object_type_game_object, fields, mb) | ||
end | ||
|
||
@impl GenServer | ||
def handle_cast({:send_update_to, pid}, state) do | ||
Logger.debug("Spawning object: #{state.game_object.game_object_template.name}") | ||
packet = update_packet(state) | ||
GenServer.cast(pid, {:send_update_packet, packet}) | ||
{:noreply, state} | ||
end | ||
|
||
@impl GenServer | ||
def init(game_object) do | ||
game_object = Map.put(game_object, :guid, game_object.guid + @game_object_guid_offset) | ||
|
||
SpatialHash.update( | ||
:game_objects, | ||
game_object.guid, | ||
self(), | ||
game_object.map, | ||
game_object.position_x, | ||
game_object.position_y, | ||
game_object.position_z | ||
) | ||
|
||
state = %{ | ||
game_object: game_object | ||
} | ||
|
||
{:ok, state} | ||
end | ||
end |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,26 @@ | ||
defmodule GameObject do | ||
use Ecto.Schema | ||
|
||
@primary_key {:guid, :integer, autogenerate: false} | ||
schema "gameobject" do | ||
field(:id, :integer, default: 0) | ||
field(:map, :integer, default: 0) | ||
field(:position_x, :float, default: 0.0) | ||
field(:position_y, :float, default: 0.0) | ||
field(:position_z, :float, default: 0.0) | ||
field(:orientation, :float, default: 0.0) | ||
field(:rotation0, :float, default: 0.0) | ||
field(:rotation1, :float, default: 0.0) | ||
field(:rotation2, :float, default: 0.0) | ||
field(:rotation3, :float, default: 0.0) | ||
field(:spawntimesecs, :integer, default: 0) | ||
field(:animprogress, :integer, default: 0) | ||
field(:state, :integer, default: 0) | ||
|
||
belongs_to(:game_object_template, GameObjectTemplate, | ||
foreign_key: :id, | ||
references: :entry, | ||
define_field: false | ||
) | ||
end | ||
end |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,39 @@ | ||
defmodule GameObjectTemplate do | ||
use Ecto.Schema | ||
|
||
@primary_key {:entry, :integer, autogenerate: false} | ||
schema "gameobject_template" do | ||
field(:type, :integer, default: 0) | ||
field(:display_id, :integer, source: :displayId, default: 0) | ||
field(:name, :string, default: "") | ||
field(:faction, :integer, default: 0) | ||
field(:flags, :integer, default: 0) | ||
field(:size, :float, default: 1.0) | ||
field(:data0, :integer, default: 0) | ||
field(:data1, :integer, default: 0) | ||
field(:data2, :integer, default: 0) | ||
field(:data3, :integer, default: 0) | ||
field(:data4, :integer, default: 0) | ||
field(:data5, :integer, default: 0) | ||
field(:data6, :integer, default: 0) | ||
field(:data7, :integer, default: 0) | ||
field(:data8, :integer, default: 0) | ||
field(:data9, :integer, default: 0) | ||
field(:data10, :integer, default: 0) | ||
field(:data11, :integer, default: 0) | ||
field(:data12, :integer, default: 0) | ||
field(:data13, :integer, default: 0) | ||
field(:data14, :integer, default: 0) | ||
field(:data15, :integer, default: 0) | ||
field(:data16, :integer, default: 0) | ||
field(:data17, :integer, default: 0) | ||
field(:data18, :integer, default: 0) | ||
field(:data19, :integer, default: 0) | ||
field(:data20, :integer, default: 0) | ||
field(:data21, :integer, default: 0) | ||
field(:data22, :integer, default: 0) | ||
field(:data23, :integer, default: 0) | ||
field(:mingold, :integer, default: 0) | ||
field(:maxgold, :integer, default: 0) | ||
end | ||
end |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,34 @@ | ||
defmodule ThistleTea.GameObjectSupervisor do | ||
use Supervisor | ||
import Ecto.Query | ||
alias ThistleTea.Mangos | ||
require Logger | ||
|
||
def start_link(args) do | ||
Supervisor.start_link(__MODULE__, args, name: __MODULE__) | ||
end | ||
|
||
@impl Supervisor | ||
def init(_args) do | ||
query = | ||
from(g in GameObject, | ||
join: gt in assoc(g, :game_object_template), | ||
preload: [game_object_template: gt], | ||
select: g | ||
) | ||
|
||
children = | ||
Mangos.all(query) | ||
|> Enum.map(fn game_object -> | ||
%{ | ||
id: {ThistleTea.GameObject, game_object.guid}, | ||
start: {ThistleTea.GameObject, :start_link, [game_object]} | ||
} | ||
end) | ||
|
||
Logger.info("Spawned #{length(children)} game objects.") | ||
|
||
opts = [strategy: :one_for_one, max_restarts: 100] | ||
Supervisor.init(children, opts) | ||
end | ||
end |