|
|
@ -5,6 +5,8 @@ import {LatLng, LatLngBoundsLiteral, Layer, Marker} from "leaflet"; |
|
|
|
import {HttpClient} from "@angular/common/http"; |
|
|
|
import {Player} from "../../entities/servers/Player"; |
|
|
|
import {of} from "rxjs"; |
|
|
|
import {Tf2dataService} from "../../services/tf2data.service"; |
|
|
|
import {MatExpansionPanel} from "@angular/material/expansion"; |
|
|
|
|
|
|
|
interface MapOverlayConfig { |
|
|
|
x: number; |
|
|
@ -15,7 +17,7 @@ interface MapOverlayConfig { |
|
|
|
@Component({ |
|
|
|
selector: "app-live-time-server-map", |
|
|
|
template: ` |
|
|
|
<div> |
|
|
|
<div class="container responsive-grid-250"> |
|
|
|
<mat-form-field appearance="fill"> |
|
|
|
<mat-label>Команда</mat-label> |
|
|
|
<mat-select [(ngModel)]="teams_select"> |
|
|
@ -33,9 +35,18 @@ interface MapOverlayConfig { |
|
|
|
</mat-option> |
|
|
|
</mat-select> |
|
|
|
</mat-form-field> |
|
|
|
|
|
|
|
<mat-form-field appearance="fill"> |
|
|
|
<mat-label>Игрок</mat-label> |
|
|
|
<mat-select [(ngModel)]="player_select" multiple> |
|
|
|
<mat-option *ngFor="let m of markers | keyvalue" [value]="m.key"> |
|
|
|
{{m.value.player.name}} |
|
|
|
</mat-option> |
|
|
|
</mat-select> |
|
|
|
</mat-form-field> |
|
|
|
</div> |
|
|
|
<div [id]="server.name+'_map'" style="height: 500px;width: 100%;"> |
|
|
|
<p hidden *ngFor="let player of server.players">{{updatePlayerPos(player)}}</p> |
|
|
|
<div *ngIf="allow_processing"><p hidden *ngFor="let player of server.players">{{updatePlayerPos(player)}}</p></div> |
|
|
|
</div> |
|
|
|
`,
|
|
|
|
styleUrls: ["servers-page.component.scss"] |
|
|
@ -45,38 +56,39 @@ export class LivetimeServerMap implements AfterViewInit { |
|
|
|
server!: Server; |
|
|
|
map!: L.Map; |
|
|
|
canShow: boolean = false; |
|
|
|
markers: {[player_id: string]: {marker: L.Marker, player: Player, hidden: boolean}} = {}; |
|
|
|
markers: {[player_id: string]: { |
|
|
|
marker: L.Marker, |
|
|
|
player: Player, |
|
|
|
hidden_via_team: boolean, |
|
|
|
hidden_via_class: boolean, |
|
|
|
hidden_via_player: boolean |
|
|
|
}} = {}; |
|
|
|
config: MapOverlayConfig = { |
|
|
|
x: 0, y: 0, hu:0 |
|
|
|
} |
|
|
|
|
|
|
|
teams:{id:number, name:string}[] = [ |
|
|
|
{id: 0, name: "Все"}, |
|
|
|
{id: 1, name: "Наблюдатель"}, {id: 2, name: "Красные"}, {id: 3, name: "Синий"} |
|
|
|
]; |
|
|
|
teams:{id:number, name:string}[] = []; |
|
|
|
teams_select: number = 0; |
|
|
|
|
|
|
|
classes:{id:number, name:string}[] = [ |
|
|
|
{id: 0, name: "Все"}, |
|
|
|
{id: 1, name: "Все"}, |
|
|
|
{id: 2, name: "Все"}, |
|
|
|
{id: 3, name: "Все"}, |
|
|
|
{id: 4, name: "Все"}, |
|
|
|
{id: 5, name: "Все"}, |
|
|
|
{id: 6, name: "Все"}, |
|
|
|
{id: 7, name: "Все"}, |
|
|
|
{id: 8, name: "Все"}, |
|
|
|
{id: 9, name: "Все"} |
|
|
|
] |
|
|
|
classes:{id:number, name:string}[] = [] |
|
|
|
classes_select: number = 0; |
|
|
|
|
|
|
|
constructor(private http: HttpClient) { |
|
|
|
player_select: string[] = []; |
|
|
|
allow_processing: boolean = false; |
|
|
|
|
|
|
|
constructor(private http: HttpClient, |
|
|
|
private tf2service: Tf2dataService) { |
|
|
|
this.classes = tf2service.TFClassType.map(clz => { |
|
|
|
return {id: tf2service.TFClassType.indexOf(clz), name: clz} |
|
|
|
}) |
|
|
|
this.teams = tf2service.TFTeam.map(t => { |
|
|
|
return {id: tf2service.TFTeam.indexOf(t), name: t} |
|
|
|
}) |
|
|
|
} |
|
|
|
|
|
|
|
ngAfterViewInit(): void { |
|
|
|
} |
|
|
|
|
|
|
|
prepareMap() { |
|
|
|
prepareMap(serverMap: MatExpansionPanel) { |
|
|
|
this.allow_processing = serverMap.hideToggle; |
|
|
|
if (this.canShow) return; |
|
|
|
|
|
|
|
this.http.head(this.generateUrl()).subscribe( |
|
|
@ -115,8 +127,10 @@ export class LivetimeServerMap implements AfterViewInit { |
|
|
|
return new LatLng(y, x); |
|
|
|
} |
|
|
|
|
|
|
|
//это пиздец какой кастыль А ВОТ А ВЬЮЮЮЮЮ А ТАМ....
|
|
|
|
updatePlayerPos(player:Player) { |
|
|
|
if (!this.map) return; |
|
|
|
if (!this.allow_processing) return; |
|
|
|
|
|
|
|
const ids = Object.keys(this.markers); |
|
|
|
const id: string = `${player.id}`; |
|
|
@ -127,28 +141,81 @@ export class LivetimeServerMap implements AfterViewInit { |
|
|
|
|
|
|
|
this.markers[id].player = player; |
|
|
|
} else { |
|
|
|
this.markers[id] = {marker: L.marker(this.getRektPos(player)), player: player, hidden: false}; |
|
|
|
this.markers[id] = { |
|
|
|
marker: L.marker(this.getRektPos(player)), |
|
|
|
player: player, |
|
|
|
hidden_via_team: false, |
|
|
|
hidden_via_class: false, |
|
|
|
hidden_via_player: false |
|
|
|
}; |
|
|
|
this.markers[id].marker.addTo(this.map); |
|
|
|
this.markers[id].marker.setIcon(this.getPlayerEmblem(player)); |
|
|
|
} |
|
|
|
|
|
|
|
//проверяем фильтр выбора команды
|
|
|
|
switch (this.teams_select) { |
|
|
|
case 0: { |
|
|
|
if (this.markers[id].hidden) { |
|
|
|
if (this.markers[id].hidden_via_team && !this.markers[id].hidden_via_class && !this.markers[id].hidden_via_player) { |
|
|
|
this.markers[id].marker.addTo(this.map); |
|
|
|
this.markers[id].hidden_via_team = false; |
|
|
|
} |
|
|
|
break; |
|
|
|
} |
|
|
|
default: { |
|
|
|
if (this.markers[id].player.team == this.teams_select && this.markers[id].hidden_via_team && !this.markers[id].hidden_via_class && !this.markers[id].hidden_via_player) { |
|
|
|
this.markers[id].marker.addTo(this.map); |
|
|
|
this.markers[id].hidden_via_team = false; |
|
|
|
} |
|
|
|
|
|
|
|
if (this.markers[id].player.team != this.teams_select && !this.markers[id].hidden_via_team && !this.markers[id].hidden_via_class && !this.markers[id].hidden_via_player) { |
|
|
|
this.markers[id].marker.remove(); |
|
|
|
this.markers[id].hidden_via_team = true; |
|
|
|
} |
|
|
|
break; |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
//проверяем фильтр класса
|
|
|
|
switch (this.classes_select) { |
|
|
|
case 0: { |
|
|
|
if (this.markers[id].hidden_via_class && !this.markers[id].hidden_via_team && !this.markers[id].hidden_via_player) { |
|
|
|
this.markers[id].marker.addTo(this.map); |
|
|
|
this.markers[id].hidden_via_class = false; |
|
|
|
} |
|
|
|
break; |
|
|
|
} |
|
|
|
default: { |
|
|
|
if (this.markers[id].player.clz == this.classes_select && this.markers[id].hidden_via_class && !this.markers[id].hidden_via_team && !this.markers[id].hidden_via_player) { |
|
|
|
this.markers[id].marker.addTo(this.map); |
|
|
|
this.markers[id].hidden_via_class = false; |
|
|
|
} |
|
|
|
|
|
|
|
if (this.markers[id].player.clz != this.classes_select && !this.markers[id].hidden_via_class && !this.markers[id].hidden_via_team && !this.markers[id].hidden_via_player) { |
|
|
|
this.markers[id].marker.remove(); |
|
|
|
this.markers[id].hidden_via_class = true; |
|
|
|
} |
|
|
|
break; |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
//проверяем челикса по имени
|
|
|
|
switch (this.player_select.length) { |
|
|
|
case 0: { |
|
|
|
if (this.markers[id].hidden_via_player && !this.markers[id].hidden_via_class && !this.markers[id].hidden_via_team) { |
|
|
|
this.markers[id].marker.addTo(this.map); |
|
|
|
this.markers[id].hidden = false; |
|
|
|
this.markers[id].hidden_via_player = false; |
|
|
|
} |
|
|
|
break; |
|
|
|
} |
|
|
|
default: { |
|
|
|
if (this.markers[id].player.team == this.teams_select && this.markers[id].hidden) { |
|
|
|
if (this.player_select.indexOf(id) != -1 && this.markers[id].hidden_via_player && !this.markers[id].hidden_via_class && !this.markers[id].hidden_via_team) { |
|
|
|
this.markers[id].marker.addTo(this.map); |
|
|
|
this.markers[id].hidden = false; |
|
|
|
this.markers[id].hidden_via_player = false; |
|
|
|
} |
|
|
|
|
|
|
|
if (this.markers[id].player.team != this.teams_select && !this.markers[id].hidden) { |
|
|
|
if (this.player_select.indexOf(id) == -1 && !this.markers[id].hidden_via_player && !this.markers[id].hidden_via_class && !this.markers[id].hidden_via_team) { |
|
|
|
this.markers[id].marker.remove(); |
|
|
|
this.markers[id].hidden = true; |
|
|
|
this.markers[id].hidden_via_player = true; |
|
|
|
} |
|
|
|
break; |
|
|
|
} |
|
|
|