Adding first implementation of known_places.

This commit is contained in:
Sergiotarxz 2023-06-21 03:35:18 +02:00
parent 5ab2381ad3
commit 12e6fb8524
12 changed files with 360 additions and 266 deletions

View File

@ -1,6 +1,6 @@
--
-- Created by SQL::Translator::Producer::PostgreSQL
-- Created on Mon Jun 19 20:00:51 2023
-- Created on Wed Jun 21 03:04:31 2023
--
;
--
@ -193,6 +193,20 @@ CREATE TABLE "player_pjs_flags" (
CREATE INDEX "player_pjs_flags_idx_owner" on "player_pjs_flags" ("owner");
CREATE INDEX "index_flag" on "player_pjs_flags" ("owner", "name");
;
--
-- Table: player_pjs_known_places
--
CREATE TABLE "player_pjs_known_places" (
"owner" uuid NOT NULL,
"planet" text NOT NULL,
"super_area" text NOT NULL,
"area" text NOT NULL,
"location" text NOT NULL,
PRIMARY KEY ("owner", "planet", "super_area", "area", "location")
);
CREATE INDEX "player_pjs_known_places_idx_owner" on "player_pjs_known_places" ("owner");
;
--
-- Table: player_pjs_log
@ -288,6 +302,10 @@ ALTER TABLE "player_companion_npcs" ADD CONSTRAINT "player_companion_npcs_fk_sta
ALTER TABLE "player_pjs_flags" ADD CONSTRAINT "player_pjs_flags_fk_owner" FOREIGN KEY ("owner")
REFERENCES "player_pjs" ("uuid") ON DELETE CASCADE ON UPDATE CASCADE DEFERRABLE;
;
ALTER TABLE "player_pjs_known_places" ADD CONSTRAINT "player_pjs_known_places_fk_owner" FOREIGN KEY ("owner")
REFERENCES "player_pjs" ("uuid") ON DELETE CASCADE ON UPDATE CASCADE DEFERRABLE;
;
ALTER TABLE "player_pjs_log" ADD CONSTRAINT "player_pjs_log_fk_owner" FOREIGN KEY ("owner")
REFERENCES "player_pjs" ("uuid") ON DELETE CASCADE ON UPDATE CASCADE DEFERRABLE;

View File

@ -4,251 +4,20 @@
BEGIN;
;
CREATE TABLE "equipment" (
"uuid" uuid NOT NULL,
PRIMARY KEY ("uuid")
);
;
CREATE TABLE "equipment_items" (
"kind" text NOT NULL,
"equipment" uuid NOT NULL,
"identifier" text NOT NULL,
"quantity" integer NOT NULL,
PRIMARY KEY ("kind", "equipment")
);
CREATE INDEX "equipment_items_idx_equipment" on "equipment_items" ("equipment");
;
CREATE TABLE "inventories" (
"uuid" uuid NOT NULL,
PRIMARY KEY ("uuid")
);
;
CREATE TABLE "inventory_items" (
"uuid" uuid DEFAULT uuid_generate_v4() NOT NULL,
"inventory" uuid NOT NULL,
"identifier" text NOT NULL,
"quantity" integer NOT NULL,
PRIMARY KEY ("uuid"),
CONSTRAINT "inventory_items_unique_item" UNIQUE ("inventory", "identifier")
);
CREATE INDEX "inventory_items_idx_inventory" on "inventory_items" ("inventory");
;
CREATE TABLE "player_companion_npcs" (
"uuid" uuid DEFAULT uuid_generate_v4() NOT NULL,
CREATE TABLE "player_pjs_known_places" (
"owner" uuid NOT NULL,
"identifier" text NOT NULL,
"nick" text,
"race" text NOT NULL,
"level" integer DEFAULT 1 NOT NULL,
"exp" integer DEFAULT 1 NOT NULL,
"equipment" uuid NOT NULL,
"stats" uuid NOT NULL,
"skills" uuid NOT NULL,
"spells" uuid NOT NULL,
"inventory" uuid NOT NULL,
PRIMARY KEY ("uuid")
);
CREATE INDEX "player_companion_npcs_idx_equipment" on "player_companion_npcs" ("equipment");
CREATE INDEX "player_companion_npcs_idx_inventory" on "player_companion_npcs" ("inventory");
CREATE INDEX "player_companion_npcs_idx_owner" on "player_companion_npcs" ("owner");
CREATE INDEX "player_companion_npcs_idx_skills" on "player_companion_npcs" ("skills");
CREATE INDEX "player_companion_npcs_idx_spells" on "player_companion_npcs" ("spells");
CREATE INDEX "player_companion_npcs_idx_stats" on "player_companion_npcs" ("stats");
;
CREATE TABLE "player_pjs" (
"uuid" uuid DEFAULT uuid_generate_v4() NOT NULL,
"owner" uuid NOT NULL,
"full_name" text NOT NULL,
"short_name" text NOT NULL,
"nick" text NOT NULL,
"race" text NOT NULL,
"team" uuid NOT NULL,
"creation_date" timestamp DEFAULT NOW() NOT NULL,
"last_activity" timestamp DEFAULT NOW() NOT NULL,
"experience" integer DEFAULT 1 NOT NULL,
"equipment" uuid NOT NULL,
"born_stats" uuid NOT NULL,
"training_stats" uuid NOT NULL,
"skills" uuid NOT NULL,
"spells" uuid NOT NULL,
"inventory" uuid NOT NULL,
"health" integer NOT NULL,
"mana" integer NOT NULL,
PRIMARY KEY ("uuid")
);
CREATE INDEX "player_pjs_idx_born_stats" on "player_pjs" ("born_stats");
CREATE INDEX "player_pjs_idx_equipment" on "player_pjs" ("equipment");
CREATE INDEX "player_pjs_idx_inventory" on "player_pjs" ("inventory");
CREATE INDEX "player_pjs_idx_owner" on "player_pjs" ("owner");
CREATE INDEX "player_pjs_idx_skills" on "player_pjs" ("skills");
CREATE INDEX "player_pjs_idx_spells" on "player_pjs" ("spells");
CREATE INDEX "player_pjs_idx_team" on "player_pjs" ("team");
CREATE INDEX "player_pjs_idx_training_stats" on "player_pjs" ("training_stats");
;
CREATE TABLE "player_pjs_flags" (
"name" text NOT NULL,
"owner" uuid NOT NULL,
PRIMARY KEY ("name", "owner")
);
CREATE INDEX "player_pjs_flags_idx_owner" on "player_pjs_flags" ("owner");
CREATE INDEX "index_flag" on "player_pjs_flags" ("owner", "name");
;
CREATE TABLE "player_pjs_log" (
"uuid" uuid NOT NULL,
"content" jsonb NOT NULL,
"owner" uuid NOT NULL,
"date" timestamp DEFAULT NOW() NOT NULL,
PRIMARY KEY ("uuid")
);
CREATE INDEX "player_pjs_log_idx_owner" on "player_pjs_log" ("owner");
CREATE INDEX "index_log" on "player_pjs_log" ("owner", "date");
;
CREATE TABLE "players" (
"uuid" uuid NOT NULL,
"username" text NOT NULL,
"encrypted_password" text NOT NULL,
"email" text NOT NULL,
"verified" boolean NOT NULL,
"verification_token" text,
"register_date" timestamp DEFAULT NOW() NOT NULL,
"last_activity" timestamp DEFAULT NOW() NOT NULL,
PRIMARY KEY ("uuid"),
CONSTRAINT "unique_constraint_email" UNIQUE ("email"),
CONSTRAINT "unique_constraint_username" UNIQUE ("username")
);
;
CREATE TABLE "skill_like_items" (
"identifier" text NOT NULL,
"owner_list" uuid NOT NULL,
"level" integer DEFAULT 1 NOT NULL,
PRIMARY KEY ("identifier", "owner_list")
);
CREATE INDEX "skill_like_items_idx_owner_list" on "skill_like_items" ("owner_list");
;
CREATE TABLE "skill_like_lists" (
"uuid" uuid DEFAULT uuid_generate_v4() NOT NULL,
PRIMARY KEY ("uuid")
);
;
CREATE TABLE "stats" (
"uuid" uuid NOT NULL,
"health" integer NOT NULL,
"mana" integer NOT NULL,
"strength" integer NOT NULL,
"resistance" integer NOT NULL,
"magic" integer NOT NULL,
"speed" integer NOT NULL,
"intelligence" integer NOT NULL,
PRIMARY KEY ("uuid")
);
;
CREATE TABLE "teams" (
"uuid" uuid NOT NULL,
"is_exploring" boolean DEFAULT false NOT NULL,
"explore_frame" integer DEFAULT 0 NOT NULL,
"leader" uuid,
"name" text NOT NULL,
"planet" text NOT NULL,
"super_area" text NOT NULL,
"area" text NOT NULL,
"location" text NOT NULL,
PRIMARY KEY ("uuid"),
CONSTRAINT "u_name" UNIQUE ("name")
PRIMARY KEY ("owner", "planet", "super_area", "area", "location")
);
CREATE INDEX "teams_idx_leader" on "teams" ("leader");
CREATE INDEX "player_pjs_known_places_idx_owner" on "player_pjs_known_places" ("owner");
;
ALTER TABLE "equipment_items" ADD CONSTRAINT "equipment_items_fk_equipment" FOREIGN KEY ("equipment")
REFERENCES "equipment" ("uuid") ON DELETE CASCADE ON UPDATE CASCADE DEFERRABLE;
;
ALTER TABLE "inventory_items" ADD CONSTRAINT "inventory_items_fk_inventory" FOREIGN KEY ("inventory")
REFERENCES "inventories" ("uuid") ON DELETE CASCADE ON UPDATE CASCADE DEFERRABLE;
;
ALTER TABLE "player_companion_npcs" ADD CONSTRAINT "player_companion_npcs_fk_equipment" FOREIGN KEY ("equipment")
REFERENCES "equipment" ("uuid") DEFERRABLE;
;
ALTER TABLE "player_companion_npcs" ADD CONSTRAINT "player_companion_npcs_fk_inventory" FOREIGN KEY ("inventory")
REFERENCES "inventories" ("uuid") DEFERRABLE;
;
ALTER TABLE "player_companion_npcs" ADD CONSTRAINT "player_companion_npcs_fk_owner" FOREIGN KEY ("owner")
ALTER TABLE "player_pjs_known_places" ADD CONSTRAINT "player_pjs_known_places_fk_owner" FOREIGN KEY ("owner")
REFERENCES "player_pjs" ("uuid") ON DELETE CASCADE ON UPDATE CASCADE DEFERRABLE;
;
ALTER TABLE "player_companion_npcs" ADD CONSTRAINT "player_companion_npcs_fk_skills" FOREIGN KEY ("skills")
REFERENCES "skill_like_lists" ("uuid") DEFERRABLE;
;
ALTER TABLE "player_companion_npcs" ADD CONSTRAINT "player_companion_npcs_fk_spells" FOREIGN KEY ("spells")
REFERENCES "skill_like_lists" ("uuid") DEFERRABLE;
;
ALTER TABLE "player_companion_npcs" ADD CONSTRAINT "player_companion_npcs_fk_stats" FOREIGN KEY ("stats")
REFERENCES "stats" ("uuid") DEFERRABLE;
;
ALTER TABLE "player_pjs" ADD CONSTRAINT "player_pjs_fk_born_stats" FOREIGN KEY ("born_stats")
REFERENCES "stats" ("uuid") DEFERRABLE;
;
ALTER TABLE "player_pjs" ADD CONSTRAINT "player_pjs_fk_equipment" FOREIGN KEY ("equipment")
REFERENCES "equipment" ("uuid") DEFERRABLE;
;
ALTER TABLE "player_pjs" ADD CONSTRAINT "player_pjs_fk_inventory" FOREIGN KEY ("inventory")
REFERENCES "inventories" ("uuid") DEFERRABLE;
;
ALTER TABLE "player_pjs" ADD CONSTRAINT "player_pjs_fk_owner" FOREIGN KEY ("owner")
REFERENCES "players" ("uuid") ON DELETE CASCADE ON UPDATE CASCADE DEFERRABLE;
;
ALTER TABLE "player_pjs" ADD CONSTRAINT "player_pjs_fk_skills" FOREIGN KEY ("skills")
REFERENCES "skill_like_lists" ("uuid") DEFERRABLE;
;
ALTER TABLE "player_pjs" ADD CONSTRAINT "player_pjs_fk_spells" FOREIGN KEY ("spells")
REFERENCES "skill_like_lists" ("uuid") DEFERRABLE;
;
ALTER TABLE "player_pjs" ADD CONSTRAINT "player_pjs_fk_team" FOREIGN KEY ("team")
REFERENCES "teams" ("uuid") ON DELETE CASCADE ON UPDATE CASCADE DEFERRABLE;
;
ALTER TABLE "player_pjs" ADD CONSTRAINT "player_pjs_fk_training_stats" FOREIGN KEY ("training_stats")
REFERENCES "stats" ("uuid") DEFERRABLE;
;
ALTER TABLE "player_pjs_flags" ADD CONSTRAINT "player_pjs_flags_fk_owner" FOREIGN KEY ("owner")
REFERENCES "player_pjs" ("uuid") ON DELETE CASCADE ON UPDATE CASCADE DEFERRABLE;
;
ALTER TABLE "player_pjs_log" ADD CONSTRAINT "player_pjs_log_fk_owner" FOREIGN KEY ("owner")
REFERENCES "player_pjs" ("uuid") ON DELETE CASCADE ON UPDATE CASCADE DEFERRABLE;
;
ALTER TABLE "skill_like_items" ADD CONSTRAINT "skill_like_items_fk_owner_list" FOREIGN KEY ("owner_list")
REFERENCES "skill_like_lists" ("uuid") ON DELETE CASCADE ON UPDATE CASCADE DEFERRABLE;
;
ALTER TABLE "teams" ADD CONSTRAINT "teams_fk_leader" FOREIGN KEY ("leader")
REFERENCES "player_pjs" ("uuid") DEFERRABLE;
;
COMMIT;

View File

@ -890,6 +890,97 @@ schema:
name: player_pjs_flags
options: []
order: 12
player_pjs_known_places:
constraints:
- deferrable: 1
expression: ''
fields:
- owner
- planet
- super_area
- area
- location
match_type: ''
name: ''
on_delete: ''
on_update: ''
options: []
reference_fields: []
reference_table: ''
type: PRIMARY KEY
- deferrable: 1
expression: ''
fields:
- owner
match_type: ''
name: player_pjs_known_places_fk_owner
on_delete: CASCADE
on_update: CASCADE
options: []
reference_fields:
- uuid
reference_table: player_pjs
type: FOREIGN KEY
fields:
area:
data_type: text
default_value: ~
is_nullable: 0
is_primary_key: 1
is_unique: 0
name: area
order: 4
size:
- 0
location:
data_type: text
default_value: ~
is_nullable: 0
is_primary_key: 1
is_unique: 0
name: location
order: 5
size:
- 0
owner:
data_type: uuid
default_value: ~
is_nullable: 0
is_primary_key: 1
is_unique: 0
name: owner
order: 1
size:
- 0
planet:
data_type: text
default_value: ~
is_nullable: 0
is_primary_key: 1
is_unique: 0
name: planet
order: 2
size:
- 0
super_area:
data_type: text
default_value: ~
is_nullable: 0
is_primary_key: 1
is_unique: 0
name: super_area
order: 3
size:
- 0
indices:
- fields:
- owner
name: player_pjs_known_places_idx_owner
options: []
type: NORMAL
name: player_pjs_known_places
options: []
order: 13
player_pjs_log:
constraints:
- deferrable: 1
@ -973,7 +1064,7 @@ schema:
type: NORMAL
name: player_pjs_log
options: []
order: 13
order: 14
players:
constraints:
- deferrable: 1
@ -1453,6 +1544,7 @@ translator:
- InventoryItem
- PJ
- PJFlag
- PJKnownPlaces
- PJLog
- Player
- SkillLikeItem

View File

@ -10,13 +10,27 @@ use feature 'signatures';
use Moo::Role;
requires qw/identifier locations name parent/;
has children => (
is => 'ro',
lazy => 1,
builder => \&_build_children,
);
## OVERRIDE
sub get_auto_discover($self) {
return 0;
}
## OVERRIDE
sub frames_to_move($self) {
return 5;
}
## OVERRIDE
sub frames_to_explore($self) {
return 7;
}
sub _build_children($self) {
my $locations = $self->locations;
my @locations = map { $locations->{$_} } keys %$locations;

View File

@ -64,6 +64,7 @@ sub handle ( $self, $ws, $session, $data ) {
]
);
$pj->location->show_intro($pj);
$pj->set_known_location($pj->location);
}
my $info_packet_to_send =

View File

@ -43,7 +43,14 @@ sub handle ( $self, $ws, $session, $data ) {
{
return $ws->send( to_json( { error => "The location is malformed" } ) );
}
my $pj = $session->{pj};
my $pj = $session->{pj};
if ( !defined $pj ) {
return $ws->send(
to_json(
{ error => 'You have not set a pj yet for this websocket.' }
)
);
}
my $team = $pj->team;
my $leader = $team->leader;
if ( $leader->uuid ne $pj->uuid ) {

View File

@ -54,9 +54,6 @@ sub loop($self) {
sub _work_frame($self) {
my $schema = $self->_schema;
say 'Starting frame work.';
sleep int(rand(30));
say 'Ending frame work.';
}
sub _real_loop($self) {

View File

@ -16,6 +16,32 @@ requires qw/identifier name description parent actions npcs/;
my $planets = LasTres::Planets->new;
## OVERRIDE
sub can_visit($self, $pj) {
return 1;
}
## OVERRIDE (Always use $self->SUPER::on_team_arrival.)
sub on_team_arrival($self, $team) {
$team = $team->get_from_storage;
for my $pj ($team->members) {
$self->on_pj_arrival($pj);
}
}
## OVERRIDE (Always use $self->SUPER::on_pj_arrival.)
sub on_pj_arrival($self, $pj) {
require LasTres::Redis;
$pj = $pj->get_from_storage;
my $redis = LasTres::Redis->new;
if (!$pj->knows_location($self)) {
$pj->set_known_location($self);
}
$self->show_intro($pj);
$redis->publish( $redis->pj_subscription($pj), to_json({ command => 'update-location' }));
}
sub show_intro ( $self, $pj ) {
$pj->append_log_line(
[
@ -28,29 +54,22 @@ sub show_intro ( $self, $pj ) {
$pj->append_log_line( [ { text => $pj->location->description }, ] );
}
sub notify_arrival($self, $team) {
require LasTres::Redis;
my $redis = LasTres::Redis->new;
for my $pj ($team->members) {
$self->show_intro($pj);
$redis->publish( $redis->pj_subscription($pj), to_json({ command => 'update-location' }));
}
}
sub place_team($self, $team) {
$team->location($self);
$team->update;
$self->notify_arrival($team);
$self->on_team_arrival($team);
}
sub to_array ($self) {
my $hash = $self->hash;
return [
$hash->{planet}{identifier}, $hash->{super_area}{identifier},
$hash->{area}{identifier}, $hash->{location}{identifier}
];
}
sub to_json_array ($self) {
my $hash = $self->hash;
return to_json(
[
$hash->{planet}{identifier}, $hash->{super_area}{identifier},
$hash->{area}{identifier}, $hash->{location}{identifier}
]
);
return to_json($self->to_array);
}
sub is_connected_by_move ( $self, $otherLocation, $pj = undef ) {
@ -66,21 +85,32 @@ sub is_connected_by_move ( $self, $otherLocation, $pj = undef ) {
return 0;
}
sub get_available_locations_to_move_to ( $self, $pj ) {
my $team = $pj->team;
my $location = $team->location;
sub get_available_locations_to_move_to ( $self, $pj = undef ) {
my $location = $self;
my $connected_places = [];
if ( $location->can('connected_places') ) {
@$connected_places = ( @{ $team->location->connected_places } );
@$connected_places = ( @{ $self->connected_places } );
}
@$connected_places =
( @$connected_places, @{ $location->parent->children } );
( @$connected_places, @{$self->_get_neighbour_locations_accesible($pj)} );
@$connected_places =
grep { $_->identifier ne $location->identifier } @$connected_places;
if (defined $pj) {
@$connected_places = grep { $_->can_visit($pj) } @$connected_places;
}
return $connected_places;
}
sub _get_neighbour_locations_accesible($self, $pj) {
my $places = [];
@$places = @{ $self->parent->children };
if (!$self->parent->get_auto_discover && defined $pj) {
@$places = grep { $pj->knows_location($_) } @$places;
}
return $places;
}
sub get ( $planet_id, $super_area_id, $area_id, $location_id ) {
my $planet = $planets->hash->{$planet_id};
if ( !defined $planet ) {

View File

@ -0,0 +1,52 @@
package LasTres::Planet::Bahdder::BosqueDelHeroe::BosqueDelHeroeI::Llano;
use v5.36.0;
use strict;
use warnings;
use utf8;
use Moo;
use LasTres::Planet::Bahdder::BosqueDelHeroe::BosqueDelHeroeI;
with 'LasTres::Location';
sub identifier {
return 'llano';
}
sub name {
return 'Llano de las liebres';
}
sub description {
return 'En el llano de las liebres suelen encontrarse roedores comestibles, y también sus depredadores...';
}
sub parent {
return LasTres::Planet::Bahdder::BosqueDelHeroe::BosqueDelHeroeI->instance;
}
sub actions {
return [];
}
sub npcs {
return [];
}
sub connected_places {
return [
LasTres::Planet::Bahdder::BosqueDelHeroe::TribuDeLaLima::Entrada->instance,
];
}
my $singleton;
sub instance {
my $class = shift;
if (!defined $singleton) {
$singleton = $class->new(@_);
}
return $singleton;
}
1;

View File

@ -5,7 +5,7 @@ use v5.36.0;
use strict;
use warnings;
our $VERSION = 6;
our $VERSION = 7;
use feature 'signatures';

View File

@ -111,7 +111,9 @@ __PACKAGE__->set_primary_key('uuid');
__PACKAGE__->has_many( 'npcs', 'LasTres::Schema::Result::CompanionNPC',
'owner' );
__PACKAGE__->has_many( 'logs', 'LasTres::Schema::Result::PJLog', 'owner' );
__PACKAGE__->has_many( 'logs', 'LasTres::Schema::Result::PJLog', 'owner' );
__PACKAGE__->has_many( 'known_places',
'LasTres::Schema::Result::PJKnownPlaces', 'owner' );
__PACKAGE__->has_many( 'flags', 'LasTres::Schema::Result::PJFlag', 'owner' );
__PACKAGE__->belongs_to( 'born_stats', 'LasTres::Schema::Result::Stats' );
__PACKAGE__->belongs_to( 'training_stats', 'LasTres::Schema::Result::Stats' );
@ -122,6 +124,44 @@ __PACKAGE__->belongs_to( 'equipment', 'LasTres::Schema::Result::Equipment' );
__PACKAGE__->belongs_to( 'team', 'LasTres::Schema::Result::Team' );
__PACKAGE__->belongs_to( 'owner', 'LasTres::Schema::Result::Player' );
sub knows_location ( $self, $location ) {
require LasTres::Schema;
my $array = $location->to_array;
my ( $planet, $super_area, $area ) = @$array[ 0 .. 2 ];
$location = $array->[3];
my $schema = LasTres::Schema->Schema;
my @places = $schema->resultset('PJKnownPlaces')->search(
{
owner => $self->uuid,
planet => $planet,
super_area => $super_area,
area => $area,
location => $location
}
);
if (@places) {
return 1;
}
return 0;
}
sub set_known_location ( $self, $location ) {
require LasTres::Schema;
my $array = $location->to_array;
my ( $planet, $super_area, $area ) = @$array[ 0 .. 2 ];
$location = $array->[3];
my $schema = LasTres::Schema->Schema;
$schema->resultset('PJKnownPlaces')
->new( {
owner => $self->uuid,
planet => $planet,
super_area => $super_area,
area => $area,
location => $location
}
)->insert;
}
sub hash ($self) {
my $image;
my $race = $self->race;

View File

@ -0,0 +1,74 @@
package LasTres::Schema::Result::PJKnownPlaces;
use v5.36.0;
use strict;
use warnings;
use feature 'signatures';
use parent 'DBIx::Class::Core';
use Data::Dumper;
use JSON qw/from_json/;
use DateTime::Format::ISO8601::Format;
use Moo;
__PACKAGE__->table('player_pjs_known_places');
__PACKAGE__->add_columns(
owner => {
data_type => 'uuid',
is_nullable => 0,
is_foreign_key => 1,
},
planet => {
data_type => 'text',
is_nullable => 0,
accessor => '_planet',
},
super_area => {
data_type => 'text',
is_nullable => 0,
accessor => '_super_area',
},
area => {
data_type => 'text',
is_nullable => 0,
accessor => '_area',
},
location => {
data_type => 'text',
is_nullable => 0,
accessor => '_location',
},
);
sub location {
my $self = shift;
my $location = shift;
my $planet;
my $super_area;
my $area;
if ( defined $location ) {
$self->_location( $location->identifier );
$area = $location->parent;
$self->_area( $area->identifier );
$super_area = $area->parent;
$self->_super_area( $super_area->identifier );
$planet = $super_area->parent;
$self->_planet( $planet->identifier );
}
$location = $self->_location;
$area = $self->_area;
$super_area = $self->_super_area;
$planet = $self->_planet;
$location =
LasTres::Location::get( $planet, $super_area, $area, $location );
return $location;
}
__PACKAGE__->set_primary_key(qw/owner planet super_area area location/);
__PACKAGE__->belongs_to( 'owner', 'LasTres::Schema::Result::PJ' );
1;