Mercurial > ~darius > hgwebdir.cgi > paradise_server
comparison src/input.c @ 4:aa38447a4b21
First entry of Paradise Server 2.9 patch 10 Beta
author | darius |
---|---|
date | Sat, 06 Dec 1997 04:37:03 +0000 |
parents | |
children |
comparison
equal
deleted
inserted
replaced
3:cafa94d86546 | 4:aa38447a4b21 |
---|---|
1 /*-------------------------------------------------------------------------- | |
2 NETREK II -- Paradise | |
3 | |
4 Permission to use, copy, modify, and distribute this software and its | |
5 documentation for any NON-COMMERCIAL purpose (following the terms of | |
6 the GNU General Public License (read the file 'COPYING')) and without | |
7 fee is hereby granted, provided that this copyright notice appear in all | |
8 copies. No representations are made about the suitability of this | |
9 software for any purpose. This software is provided "as is" without | |
10 express or implied warranty. | |
11 | |
12 Xtrek Copyright 1986 Chris Guthrie | |
13 Netrek (Xtrek II) Copyright 1989 Kevin P. Smith | |
14 Scott Silvey | |
15 Paradise II (Netrek II) Copyright 1993 Larry Denys | |
16 Kurt Olsen | |
17 Brandon Gillespie | |
18 | |
19 Comprehensive credits are available in the file "CREDITS" | |
20 --------------------------------------------------------------------------*/ | |
21 | |
22 #include "config.h" | |
23 #include <stdio.h> | |
24 #include <string.h> | |
25 #include <math.h> | |
26 #include <sys/types.h> | |
27 #include <sys/time.h> | |
28 #include <signal.h> | |
29 #include <errno.h> | |
30 #include "defs.h" | |
31 #include "struct.h" | |
32 #include "data.h" | |
33 #include "shmem.h" | |
34 | |
35 static int sendflag = 0; | |
36 | |
37 extern int intrupt(); | |
38 extern void start_interruptor(); | |
39 extern int isClientDead(); | |
40 int reconnect(); | |
41 extern int readFromClient(); | |
42 extern void stop_interruptor(); | |
43 extern int exitGame(); | |
44 extern int closeUdpConn(); | |
45 extern unsigned int sleep(); | |
46 extern int connectToClient(); | |
47 extern void (*r_signal()) (); | |
48 | |
49 void | |
50 setflag() | |
51 { | |
52 sendflag = 1; | |
53 } | |
54 | |
55 | |
56 void | |
57 input() | |
58 { | |
59 fd_set readfds; | |
60 | |
61 start_interruptor(); | |
62 | |
63 /* Idea: read from client often, send to client not so often */ | |
64 while (me->p_status == PALIVE || | |
65 me->p_status == PEXPLODE || | |
66 me->p_status == PDEAD || | |
67 me->p_status == POBSERVE) | |
68 { | |
69 if (isClientDead()) | |
70 { | |
71 if (!reconnect()) | |
72 exit(0); | |
73 } | |
74 FD_ZERO(&readfds); | |
75 FD_SET(sock, &readfds); | |
76 if (udpSock >= 0) | |
77 FD_SET(udpSock, &readfds); | |
78 | |
79 /* | |
80 * blocks indefinitely unless client input or timerDelay SIGALRM causes | |
81 * EINTR | |
82 */ | |
83 | |
84 if (socketWait() > 0) | |
85 { | |
86 readFromClient(); | |
87 } | |
88 if (sendflag) | |
89 { | |
90 intrupt(); | |
91 sendflag = 0; | |
92 } | |
93 | |
94 /* statements below are executed once per timerDelay */ | |
95 if (me->p_updates > delay) | |
96 { | |
97 me->p_flags &= ~(PFWAR); | |
98 } | |
99 if (me->p_updates > rdelay) | |
100 { | |
101 me->p_flags &= ~(PFREFITTING); | |
102 } | |
103 | |
104 /* | |
105 * this will ghostbust a player if no ping has been received in | |
106 * ping_ghostbust_interval seconds | |
107 */ | |
108 | |
109 if (configvals->ping_allow_ghostbust | |
110 && (me->p_status == PALIVE || me->p_status == POBSERVE) | |
111 && ping_ghostbust > configvals->ping_ghostbust_interval) | |
112 me->p_ghostbuster = 100000; /* ghostbusted */ | |
113 else | |
114 /* Keep self from being nuked... */ | |
115 me->p_ghostbuster = 0; | |
116 } | |
117 stop_interruptor(); | |
118 } | |
119 | |
120 int | |
121 reconnect() | |
122 { | |
123 int i; | |
124 | |
125 if (noressurect) | |
126 exitGame(); | |
127 stop_interruptor(); | |
128 | |
129 r_signal(SIGIO, SIG_IGN); | |
130 #ifdef DEBUG | |
131 printf("Ack! The client went away!\n"); | |
132 printf("I will attempt to resurrect him!\n"); | |
133 fflush(stdout); | |
134 #endif | |
135 commMode = COMM_TCP; | |
136 if (udpSock >= 0) | |
137 closeUdpConn(); | |
138 | |
139 /* For next two minutes, we try to restore connection */ | |
140 shutdown(sock, 2); | |
141 sock = -1; | |
142 for (i = 0;; i++) | |
143 { | |
144 me->p_ghostbuster = 0; | |
145 sleep(5); | |
146 if (connectToClient(host, nextSocket)) | |
147 break; | |
148 if (i == 23) | |
149 { | |
150 #ifdef DEBUG | |
151 printf("Oh well, maybe I'm getting rusty!\n"); | |
152 fflush(stdout); | |
153 #endif | |
154 return 0; | |
155 } | |
156 } | |
157 start_interruptor(); | |
158 #ifdef DEBUG | |
159 printf("A miracle! He's alive!\n"); | |
160 fflush(stdout); | |
161 #endif | |
162 return 1; | |
163 } |