Compare commits

..
Author SHA1 Message Date
Danielv123 95d23e9615 Create the character at spawn when it can't be made in place
create_character needs a free spot within 200 tiles and does not
generate chunks to find one, so it failed for a player teleported into
a chunk that does not exist yet, and where there is only water or void.
The download then failed and left the player as a spectator.

Resolves #1187
2026-11-10 21:48:20 +01:00
3 changed files with 19 additions and 8 deletions

No files matched your search

@@ -182,7 +182,6 @@ function SearchModsTable(props: SearchModsTableProps) {
return <>
<Input
autoFocus
placeholder="Search Mods"
style={{ marginBottom: 8 }}
onChange={(event) => {
+3 -6
View File
@@ -1,8 +1,7 @@
import React, { Fragment, useState, useContext, useEffect, useMemo, useRef } from "react";
import React, { Fragment, useState, useContext, useEffect, useMemo } from "react";
import { useNavigate } from "react-router-dom";
import {
Button, Form, Input, InputRef, Modal, Popconfirm, Space, Table, Typography, Upload, Alert, Select, Tooltip,
notification,
Button, Form, Input, Modal, Popconfirm, Space, Table, Typography, Upload, Alert, Select, Tooltip, notification,
} from "antd";
import {
ImportOutlined, PlusOutlined, SearchOutlined, DownloadOutlined,
@@ -148,7 +147,6 @@ function SearchModsButton() {
const account = useAccount();
const [open, setOpen] = useState(false);
const [form] = Form.useForm();
const nameInputRef = useRef<InputRef>(null);
const [searchText, setSearchText] = useState("");
const [factorioVersion, setFactorioVersion] = useState<lib.MajorMinorVersion>("2.0");
@@ -335,7 +333,6 @@ function SearchModsButton() {
title="Search Mod Portal"
open={open}
onCancel={() => { setOpen(false); }}
afterOpenChange={visible => { if (visible) { nameInputRef.current?.focus(); } }}
width={1000}
footer={[
<Button key="close" onClick={() => { setOpen(false); }}>
@@ -352,7 +349,7 @@ function SearchModsButton() {
initialValues={{ factorioVersion: factorioVersion, name: searchText }}
>
<Form.Item name="name" label="Filter by Name or Title">
<Input ref={nameInputRef} placeholder="Start typing to filter..." />
<Input placeholder="Start typing to filter..." />
</Form.Item>
<Form.Item
name="factorioVersion"
+16 -1
View File
@@ -1271,8 +1271,23 @@ local function ensure_character(player)
player.teleport(force.get_spawn_position(planet_surface), planet_surface)
end
-- Create and return the character
-- create_character needs a free spot within 200 tiles and does not generate chunks to find one. It fails in a chunk
-- which does not exist yet, such as one the player was teleported into a moment ago, and where water or void is all
-- there is. The character is then made at the force's spawn. From a missing chunk it is moved back, as the game
-- generates the chunks around a character. Otherwise there is nowhere to stand, and it stays at the spawn.
if not player.create_character() then
surface = player.surface
local position = player.position
local force = player.force --[[@as LuaForce]]
local missing_chunk = not surface.is_chunk_generated({ math.floor(position.x / 32), math.floor(position.y / 32) })
player.teleport(force.get_spawn_position(surface), surface)
if player.create_character() and missing_chunk then
player.teleport(position, surface)
end
end
-- Return the character
if not player.character then
error(string.format(
"Failed to create character (controller: %s, physical: %s, surface: %s, connected: %s, driving: %s)",
controller_to_name[player.controller_type],